题目
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
示例1
输入:{1,3,5},{2,4,6}
返回值:{1,2,3,4,5,6}
示例2
输入:{},{}
返回值:{}
解
思路
比较两个链表的首结点,哪个小的的结点则合并到第三个链表尾结点,并向前移动一个结点。
结果会有一个链表先遍历结束,或者没有
第三个链表尾结点指向剩余未遍历结束的链表
返回第三个链表首结点
代码
public class Solution {
public ListNode Merge(ListNode l1,ListNode l2) {
//设置虚拟节点,值为任意数
ListNode dummy=new ListNode(1);
//pre指针指向虚拟节点
ListNode pre =dummy;
//遍历两个链表,比较l1和l2大小
while(l1!=null&&l2!=null){
//l1节点的值小于等于l2节点值
if(l1.val<=l2.val){
//pre指向节点next指针指向更小值的节点(指向l1)
pre.next=l1;
//l1向后移动
l1=l1.next;
}else{
pre.next=l2;
l2=l2.next;
}
//pre向后移动
pre=pre.next;
}
//跳出循环,l1或者l2有剩余节点
//把剩余节点加入到pre的next指针位置
//l1还有节点
if(l1!=null){
//l1剩余节点全部加入到pre的next位置
pre.next=l1;
}
if(l2!=null){
pre.next=l2;
}
//返回虚拟节点的next指针
return dummy.next;
}
}