# 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
1
2
3
4
5
2
3
4
5
# 前置条件
// 单向列表
function ListNode(val) {
this.val = val;
this.next = null;
}
1
2
3
4
5
2
3
4
5
# 方法一: 递归
https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode/
var mergeTwoLists = function (l1, l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else 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
2
3
4
5
6
7
8
9
10
11
12
13
# 方法二: 同上,只是创建了新的链表,没有破坏原先的链表
var mergeTwoLists1 = function(l1, l2) {
if (l1 === undefined || l1 === null) return l2
if (l2 === undefined || l2 === null) return l1
const current = new ListNode('')
if (l1.val >= l2.val) {
current.val = l2.val
current.next = mergeTwoLists(l1, l2.next)
} else {
current.val = l1.val
current.next = mergeTwoLists(l1.next, l2)
}
return current
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方法3: 迭代
// https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode/
var mergeTwoLists = function (l1, l2) {
// maintain an unchanging reference to node ahead of the return node.
let prehead = new ListNode(-1)
let prev = prehead
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1
l1 = l1.next
} else {
prev.next = l2
l2 = l2.next
}
prev = prev.next
}
// exactly one of l1 and l2 can be non-null at this point, so connect
// the non-null list to the end of the merged list.
prev.next = l1 == null ? l2 : l1
return prehead.next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23