剑指offer 合并有序链表js

题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则

有两种方法,递归和非递归,递归方式比较难以理解,所以后来自己想了非递归方式,(和合并两个有序数组类似,只不过对于链表结构,要将节点的指针相互链接上)

非递归方式 

下面的代码加了我傻瓜式注释,但是还是很好理解的。

function Merge(pHead1, pHead2)
{
    var res;
    var p1=pHead1;
    var p2=pHead2;
    if(p1===null){ return p2;}
    if(p2===null){return p1;}
//确定新链表头指针,链表要以头指针返回
    if(p1.val<p2.val){
        res=p1;
        p1=p1.next;
    }else{
        res=p2;   //res为合并后链表的头,接下来只要依次将元素链接上即可
        p2=p2.next;
    }
    var cur=res;//当前链表的结尾节点
    while(p1!==null&&p2!==null){
        if(p1.val<p2.val){
            cur.next=p1;//将p1链接到当前链表末尾
            cur=p1;//末尾更新,后移
            p1=p1.next;//需要合并的节点后移
        }else{
           cur.next=p2;
           cur=p2;
           p2=p2.next;
        }
    }
    if(p1!==null){ //p2已经空了,跳出while循环,将p1为头指针的后续链表连接上
        cur.next=p1;
    }
    if(p2!==null){  //p1已经空了,跳出while循环,将p2为头指针的后续链表连接上
        cur.next=p2;
    }
    return res;
}

递归方式

function Merge(pHead1, pHead2)//每次参加递归的头指针
{
    var p=null;   //每次链接到新链表的节点,初始化为空 
    if(pHead1===null){
        return pHead2;   //特殊情况,递归出口
    }
    if(pHead2===null){
        return pHead1;
    }
    if(pHead1.val<pHead2.val){
        p=pHead1;
        p.next=Merge(pHead1.next,pHead2);
    }else{
        p=pHead2;
        p.next=Merge(pHead1,pHead2.next);
    }
    return p; //回溯后,这个p就是pHead1或者pHead2,链表头指针
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值