JZ25 合并两个排序的链表

60 阅读1分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 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
};