Leetcode21. 合并两个有序链表

21. 合并两个有序链表

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

merge_ex1

示例 1:

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

示例 2:

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

示例 3:

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

解法1:递归法

根据以上规律考虑本题目:

终止条件:当两个链表都为空时,表示我们对链表已合并完成。
如何递归:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1==null)return list2;
if (list2==null)return list1;

if (list1.val < list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}else {
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
}
}

主要想清楚几点问题就行了 1.这个问题的子问题是什么。2.当前层要干什么事情。3.递归出口。想清楚这几点就好啦。

很多刚接触递归的同学习惯往深处想,就想想清楚下一层,下下层到底咋回事,千万别!这样永远也想不清楚的,你只要把当前层的事情干好,边界条件找好,深层自然而然就是对的。千万别想那么深。

解法3:模拟法(比较垃圾)

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
28
29
30
31
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null)return list2;
if(list2 == null)return list1;


ListNode start = new ListNode(1);
if (list1.val > list2.val) {
start.val = list2.val;
list2 = list2.next;
}else {
start.val = list1.val;
list1 = list1.next;
}
ListNode cur = start;

while(list1 !=null && list2 != null){
if (list1.val > list2.val){
cur.next = new ListNode(list2.val);
list2 = list2.next;

}else {
cur.next = new ListNode(list1.val);
list1 = list1.next;
}
cur = cur.next;
}
cur.next = list1 == null?list2:list1;
return start;
}
}