剑指offer 合并有序链表js

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

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

剑指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,链表头指针
}