输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。(0 <= 链表长度 <= 1000
)
输入:链表`l1`: 1->2->4, 链表`l2`: 1->3->4
输出:1->1->2->3->4->4
解题思路:
根据描述, 链表l1
和l2
是递增的,使用双指针遍历两链表,根据 l1.val
和 l2.val
的大小关系确定节点添加顺序,两节点指针交替前进,直至遍历完毕。
引入伪头节点: 由于初始状态合并链表中无节点,因此循环第一轮时无法将节点添加到合并链表中。
解决方案:初始化一个辅助节点 dum
作为合并链表的伪头节点,将各节点添加至 dum
之后。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dum = new ListNode(0), cur = dum;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
cur.next = l1;
l1 = l1.next;
}
else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
if(l1 != null ) {
cur.next =l1;
} else {
cur.next =l2;
}
return dum.next;
}
}
image.png
image.png
算法流程:
-
初始化: 伪头节点
dum
,节点cur
指向dum
-
循环合并: 当
l1
或l2
为空时跳出;- 当
l1.val < l2.val
时:cur 的后继节点指定为 l1,并 l1向前走一步; - 当
l1.val >= l2.val
时:cur 的后继节点指定为 l2,并 l2向前走一步; - 节点
cur
向前走一步,cur=cur.next
- 当
-
合并剩余尾部: 跳出时有两种情况,即
l1
为空或l2
为空。- 若l1不等于null : 将l1添加至节点
cur
之后; - 否则: 将l2添加至节点
cur
之后。
- 若l1不等于null : 将l1添加至节点
-
返回值: 合并链表在伪头节点
dum
之后,因此返回dum.next
即可。
复杂度分析:
- 时间复杂度
O(M+N)
: M,N 分别为链表l1,l2的长度,合并操作需遍历两链表。 - 空间复杂度
O(1)
: 节点引用 dum , cur 使用常数大小的额外空间。
网友评论