链表合并
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6}
思路:
双指针:这道题既然两个链表已经是排好序的,都是从小到大的顺序,那我们要将其组合,可以使用归并排序的思想:每次比较两个头部,从中取出最小的元素,然后依次往后。这样两个链表依次往后,我们肯定需要两个指针同方向访问才能实现。
具体过程:
- step 1:判断空链表的情况,只要有一个链表为空,那答案必定就是另一个链表了,就算另一个链表也为空。
- step 2:新建一个空的表头后面连接两个链表排序后的节点,两个指针分别指向两链表头。
- step 3:遍历两个链表都不为空的情况,取较小值添加在新的链表后面,每次只把被添加的链表的指针后移。
- step 4:遍历到最后肯定有一个链表还有剩余的节点,它们的值将大于前面所有的,直接连在新的链表后面即可。
function ListNode(x){
this.val = x;
this.next = null;
}
function Merge(pHead1, pHead2)
{
// write code here
if (!pHead1) return pHead2;
if (!pHead2) return pHead1;
let cur=new ListNode(0);
let head=cur;
while(pHead1 && pHead2){
if (pHead1.val <=pHead2.val){
cur.next = pHead1;
pHead1=pHead1.next;
}
else {
cur.next = pHead2;
pHead2=pHead2.next;
}
cur=cur.next;
}
if (pHead1) cur.next = pHead1;
else cur.next = pHead2;
return head.next;
}
module.exports = {
Merge : Merge
};
阅读剩余
版权声明:
作者:chun
链接:https://chun53.top/967.html
文章版权归作者所有,未经允许请勿转载。
THE END