剑指offer随练

合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:使用递归的方法,合并头节点,然后对剩下的链表接着合并头节点,直到合并完毕。
或者可以使用非递归的方法,新建一个新的链表,然后依次对两链表的头节点进行比较,哪个小就放到新的链表中,而且该链表向后移动一位。

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
//递归
function Merge(pHead1, pHead2)
{
    if(pHead1==null){
        return pHead2;
    }
    if(pHead2==null){
        return pHead1;
    }
    if(pHead1.val<=pHead2.val){
        pHead1.next = Merge(pHead1.next,pHead2);
        return pHead1;
    } else {
        pHead2.next = Merge(pHead2.next,pHead1);
        return pHead2;
    }
}



//非递归
function Merge(pHead1, pHead2)
{
    var a = new ListNode(1);
    var b = a;
    
    if(pHead1==null){
        return pHead2;
    }
    if(pHead2==null){
        return pHead1;
    }
    while(pHead1!=null&&pHead2!=null){
        if(pHead1.val<=pHead2.val){
            a.next = pHead1;
            pHead1 = pHead1.next;
        } else {
            a.next = pHead2;
            pHead2 = pHead2.next;
        }
        a = a.next;
        
    }
    if(pHead1 != null){
        a.next = pHead1;
    } else {
        a.next = pHead2;
    }
    return b.next;
}

链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:让a和b都指向链表的头节点,然后a先走k步,然后a,b一起接着向后走,当a==null的时候,这时的b就是链表的倒数第k个节点。当然,要考虑一些特殊情况。

function FindKthToTail(head, k)
{
    if(head==null||k<=0)//考虑链表为空和k小于0的特殊情况,返回null
        return null;
    var a = head;
    var b = head;
    while(k>0){
        if(a==null){
            return null;
        }
        //如果再走完k步之前,a已经等于null,即k大于链表长度,那么返回null
        a = a.next;
        k--;
    }
    while(a!=null){
        a = a.next;
        b = b.next;
    }
    return b;
}
posted @ 2018-02-26 16:03  xzhx  阅读(103)  评论(0编辑  收藏  举报