“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情”
描述
输入两个递增的链表,单个链表的长度为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 current = new ListNode();
//创建哑节点,放置新链表之前,占位(因为current要向前移动,不占位无法找回头指针返回完整链表)
let dummy = current;
//p1,p2不为空
while(pHead1 !== null && pHead2 !== null){
//判断大小
if(pHead1.val < pHead2.val){
//将小的节点存入新链表
current.next = pHead1;
//并移动p1指针
pHead1 = pHead1.next;
}else{
current.next = pHead2;
pHead2 = pHead2.next;
}
//存放完节点,移动新链表指针
current = current.next;
}
//当比较完,如果有链表有剩余节点
if(pHead1 !== null){
//因为是递增链表,没有比较完的所有节点一定都比新链表大,直接存放
current.next = pHead1;
}
if(pHead2 !== null){
current.next = pHead2;
}
//dummy在新链表之前,dummy.next才是完整链表
return dummy.next;
}
module.exports = {
Merge : Merge
};