题目:合并两个有序链表

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

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/

解题思路

两条有序链表合并,简单的思路就是新建一个空链表,同时横向对比两个链表每一个值的大小进行拼接,具体步骤如下:

  • L1L2进行循环对比,去相对小值拼接进L3,如下图: 0021-01.png
    在两个值想等情况下先取L1的值进行拼接,拼接后L1当前值移动到下一位,如下图: 0021-02.png
  • 继续循环比较L1L2的值,右上图可以看出L1当前值要比L2当前值大,因此L2当前值继续拼接到L3同时移动到下一位 0021-03.png
  • 重复以上步骤,循环的终止条件设定为L1L2同时不为空,因为L1L2的长度有可能是不相同的,可能出现L1已经循环为空但是L2还有剩余节点,所以循环对比后再加两个判定:
    if(l1){
        cur.next = l1
    }
    if(l2){
        cur.next = l2
    }

判断哪个不为空就直接拼接到L3上,最后返回L3初始值的下一个节点

代码实现

const mergeTwoLists = function(l1, l2) {
    let vlist = new ListNode(null),
        cur = vlist;
    while(l1 && l2){
        if(l1.val < l2.val){
            cur.next = l1
            l1 = l1.next
        }else if(l1.val === l2.val){
            cur.next = l1
            l1 = l1.next
        }else {
            cur.next = l2
            l2 = l2.next
        }
        cur = cur.next
    }
    if(l1){
        cur.next = l1
    }
    if(l2){
        cur.next = l2
    }
    cur = vlist.next
    vlist = null
    return cur
};