目录
一、题目
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
二、分析
1)初始化:
初始化一个临时结点merge。当前结点cur指向merge的头结点temp。
2)合并:
遍历L1、L2,当其中一个为空时结束遍历。
若l1<l2,cur.next=l1,l1向后走一步。
若l1>l2,cur.next=l2,l2向后走一步。
cur向前走一步。
若其中一个为空、退出循环、将另一个链表追加至cur。
3)结果:
merge.next 即为所求;
三、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 特殊情况
if(l1==null){
return l2;
}
if (l2==null){
return l1;
}
ListNode merge = new ListNode(0);
ListNode temp = merge;
while (l1!=null && l2!=null){
// 比较大小
if(l1.val < l2.val){
temp.next = l1;
l1 =l1.next;
}else {
temp.next =l2;
l2 =l2.next;
}
temp =temp.next;
}
temp.next = l1==null? l2:l1;
return merge.next;
}
}
空间复杂度O(1),时间复杂度O(M+N),M、N时l1、l2的长度。
执行结果:
四、总结
1、链表初始化时无需指定大小。
2、避免每一步都判断temp.next是否为空,故而初始化一个merge;