题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
解题方法
双指针遍历
为了方便返回链表后的头结点,我们设置一个哑结点(dummyNode),哑结点的next指针指向升序链表的头结点。
已知两个链表都是升序链表,我们初始设置指针p
指向哑结点,指针l1
和l2
分别指向两个链表的头结点,此时最小的元素必然在l1.val
和l2.val
之间,若最小元素是l1.val
,则将p
的next
指针指向l1
的结点,p
也重新指向l1
的结点,l1
指针指向l1.next
的结点;若最小元素是l2.val
,则将p
的next
指针指向l2
的结点,p
也重新指向l2
的结点,l2
指针指向l2.next
的结点。下一个最小的元素也必然在l1.val
和l2.val
之间,还是按照上面的方法让l1
和l2
的指针不断往后遍历。直到l1
或者l2
遍历到末尾时,p
的next
指针指向l1
和l2
之中还没有遍历到末尾的指针。此时,返回哑结点的next
结点即为升序链表的头结点。
java代码
ListNode结构
public class ListNode {
public int val;
public ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
链表合并方法
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummyNode = new ListNode(0, null);
ListNode p = dummyNode;
ListNode l1 = list1;
ListNode l2 = list2;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
p.next = l1;
p = p.next;
l1 = l1.next;
} else {
p.next = l2;
p = p.next;
l2 = l2.next;
}
}
if (l1 != null) {
p.next = l1;
} else {
p.next = l2;
}
return dummyNode.next;
}
时间复杂度:
O
(
M
+
N
)
O(M+N)
O(M+N),
M
M
M和
N
N
N为两个链表的长度
空间复杂度:
O
(
1
)
O(1)
O(1)
- 个人公众号
- 个人小游戏