描述
输入两个递增的链表,单个链表的长度为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
输入:
{},{}
返回值:
{}
示例3
输入:
{-1,2,4},{1,3,4}
返回值:
{-1,1,2,3,4,4}
主要思路:
首先需要判断两个链表是否其中一个链表为空,如果为空则直接返回另外一个链表即可(白嫖)。然后初始化表头,如果第一个链表的第一个值小于等于第二个链表的第一个值则表头初始化为第一个链表的第一个值,如果大于则初始化为第二个链表的第一个值,接下来重点:一定要把表头的初始指针的位置保存下来方便后面返回!!!
接下来就是进行合并操作,循环的条件是如果有第一个链表或者第二个链表中的某一个到达链表的尾部则停止,然后这个合并操作就和归并排序的思想一致,这里就不多说了,不懂的小伙伴自己下去复习一下喔~。完整代码如下:
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function Merge(pHead1, pHead2)
{
// write code here
let p1,p2=null;
let pnew=null;
p1=pHead1;
p2=pHead2;
// 判断:如果有一个已经为空了就返回另外一个
if(p1===null) {
return p2;
}
if(p2===null)
{
return p1;
}
if(p1.val<=p2.val) {
pnew=p1;
p1=p1.next;
}
else {
pnew=p2;
p2=p2.next;
}
let res=pnew;
while(p1!==null&&p2!==null) {
if(p1.val<=p2.val) {
pnew.next=p1;
p1=p1.next;
}
else {
pnew.next=p2;
p2=p2.next;
}
pnew=pnew.next;
}
if(p1===null) {
pnew.next=p2;
}
if(p2===null) {
pnew.next=p1;
}
return res;
}
module.exports = {
Merge : Merge
};