# 21.合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:1->2->4,1->3->4
输出:1->1->2->3->4->4
1
2
2
# 思路
递归
- 终止条件:两条链表分别名为
l1
和l2
,当l1
为空或l2
为空时结束。 - 返回值:每一层调用都返回排序号的链表头
- 递归内容:如果
l1
的val
值更小,则将l1.next
和链表头相接,l2
同理。 O(m+n)
,m
为l1
的长度,n
为l2
的长度。
- 终止条件:两条链表分别名为
迭代
- 每次比较
l1.val
和l2.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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16