21. 合并两个有序链表

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

示例 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]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

题解:

迭代法

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
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {

//哑结点,标识链表头部
ListNode dummy = new ListNode();
//pre指针用来指示当前插入位置
ListNode pre = dummy;

//两链表都非空时进行插入合并操作,有一个为空直接对另一个进行连接操作即可
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) {
pre.next = list1;
list1 = list1.next;
} else {
pre.next = list2;
list2 = list2.next;
}

pre = pre.next;

}
//合并之后还有部分链表没有合并,则直接将其连到链表尾端即可
pre.next = list1 == null ? list2:list1;


return dummy.next;
}
  • 时间复杂度:O(m+n),m和n分别是两链表的长度
  • 空间复杂度:O(1)