Leetcode刷题(一)

243 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

今天在leetcode上刷了几道题,来记录一下,大家也可以去试试呀。

反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

第一道就是我们的反转链表,我们可以来分析一下怎么实现它,实现步骤如下:

  1. 定义两个指针h、p,h指针指向链表的头指针,p指针指向遍历过元素链表
  2. h.next = p;将当前元素的下一个元素指向前面的链表
  3. p = h;将p指向遍历后的链表首部
  4. head = head.next;依次遍历直到结束
初始值:1->2->3->4->5->NULL
第一次循环:
    p -> null; h -> null head -> 1->2->3->4->5->NULL
        ====>
    h -> 1; head -> 2->3->4->5->NULL; h -> 1 -> null; p -> 1 -> null
第二次循环:
    p -> 1 -> null; h -> 1; head -> 2->3->4->5->NULL;
        ====>
    h -> 2; head -> 3->4->5->NULL; h -> 2 -> 1 -> null; p -> 2 -> 1 -> null
依次执行,直到head为空
   h -> 5; head -> null; h -> 5 -> 4 ... -> 1 -> null; p -> 5 -> 4 ... -> 1 -> null
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    let p = null;
    let h = null;
    while(head !== null) {
        h = head;
        head = head.next;
        h.next = p;
        p = h;
    }

    return p;
};

至此,我们反转链表的算法也就实现了,是不是很简单忍不住试一把。

合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例如下:

输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]
-----
输入: l1 = [], l2 = []
输出: []

分析如下:

  1. 当两个链表其中一个为空时,直接返回另一个链表,那么他就是有序的
  2. 当两个链表都不为空时进行比较,因为他们本身就是有序的,那么当第一个链表的第一个数小于第二个链表第一个数时,新链表的第一个数就是第一个链表的第一个数,他的下一个数就是mergeTwoLists(l1.next, l2)中产生的最小数了,依次类推,进行递归得到结果。
var mergeTwoLists = function(l1, l2) {
    if(!l1) return l2;
    if(!l2) return l1;
    while(l1 != null && l2 != null) {
        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
};

至此,我们的合并两个有序链表到此也实现了,今天我们的刷题就到这里了,介绍了两道算法题。