LeetCode 👉 HOT 100 👉 合并两个有序链表 - 简单题

178 阅读2分钟

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

题目

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

image.png

示例1

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

示例2

输入:l1 = [], l2 = []
输出:[]

示例3

输入:l1 = [], l2 = [0]
输出:[0]

思路

题目给了两个 升序链表,要求合并两个链表,返回一个依然是升序的链表

既然是链表结构,那么遍历两个链表是必然要做的事情,在遍历的过程中,可以判断两个链表的当前节点的大小,即 node.val。谁比较小,就把谁放在新链表的前面,然后将当前节点的引用改为下一个节点,即 node = node.next;重复上述步骤,新链表就是合并题目所给的两个链表之后的结果,同时也是升序的。

步骤如下:

  • 新建一个空链表 head = h = new ListNode()

  • 每次遍历两个链表,考虑以下情况

    • 两个链表都未遍历完成:取两个链表的当前节点,比较大小,将较小的节点复制给 h.next,同时将当前链表(l1 | l2)指向下一个节点,即(l1 = l1.next | l2 = l2.next),也需将新链表的节点指向下一个节点;

    • 有一个链表已经遍历完成(l1),则只需要将 l2 复制给新链表当前节点的下一个节点的引用 h.next = l2;这时,因为有一个链表已经遍历完成,无需再遍历了,返回新链表的头节点即可 head.next

代码如下

    /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     * }
     */
    /**
     * @param {ListNode} l1
     * @param {ListNode} l2
     * @return {ListNode}
     */
    var mergeTwoLists = function(l1, l2) {
        if(!l1) return l2;
        if(!l2) return l1;

        let head = h = new ListNode();

        while(l1 || l2) {
            if(l1 && l2) {
                if(l1.val <= l2.val) {
                    h.next = new ListNode(l1.val);
                    l1 = l1.next;
                } else {
                    h.next = new ListNode(l2.val);
                    l2 = l2.next;
                }
            } else if(l1) {
                h.next = l1;
                return head.next;
            } else {
                h.next = l2;
                return head.next;
            }

            h = h.next;
        }

        return head.next;
    };

小结

这道题还是比较简单的,只需要掌握链表的遍历方式即可(head = head.next

LeetCode 👉 HOT 100 👉 合并两个有序链表 - 简单题

合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍