# 21.合并两个有序链表

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

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

# 思路

  • 递归

    • 终止条件:两条链表分别名为l1l2,当l1为空或l2为空时结束。
    • 返回值:每一层调用都返回排序号的链表头
    • 递归内容:如果l1val值更小,则将l1.next和链表头相接,l2同理。
    • O(m+n)ml1的长度,nl2的长度。
  • 迭代

    • 每次比较l1.vall2.val的大小,取小的值,同时更新小的值指向下一个节点
    • 两者有一个为空则循环停止
    • 最后判断两个链表哪个非空,在将非空的链表和tmp哨兵节点连接就好了。

# 解法

  • 递归
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    if(l1 === null){
        return l2;
    }
    if(l2 === null){
        return l1;
    }
    if(l1.val < l2.val){
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    }else{
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  • 迭代
var mergeTwoLists = function(l1,l2) {
    let newNode = new ListNode('start') // 头节点
    let tmp = newNode //哨兵节点
    while(l1 && l2) {
        if(l1.val >= l2.val) {
            tmp.next = l2
            l2 = l2.next
        } else {
            tmp.next = l1
            l1 = l1.next
        }
        tmp = tmp.next // 哨兵节点更新指向下一个节点
    }
    tmp.next= l1 == null ? l2 : l1;
    return newNode.next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16