剑指OFFER——合并两个有序的链表

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

再做这道题就是想不起来书上怎么做的了,但是最近看STL里面全是这种基础的合并啊,比较啊。就算不会也看会了。

循环我用了4个指针。p和q分别指向两个链表当前需要比较的元素,l和k分别代表“新”的链表的旧节点和新节点,防止断了。

每次新比较的结果给k,l代表之前的节点。

 

循环:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1==NULL||pHead2==NULL){
            if(pHead2==NULL)
                return pHead1;
            else return pHead2;}
        ListNode *p=pHead1,*q=pHead2;
        pHead1= pHead1->val<pHead2->val? pHead1:pHead2;
        ListNode *k=pHead1,*l=pHead1;
        while(p!=NULL&&q!=NULL){
            if(p->val < q->val){
                k=p;
                p=p->next;
            }
            else {
                k=q;
                q=q->next;
            }
            l->next=k;
            l=k;
        }
        if(q==NULL)
            l->next=p;
        if(p==NULL)
            l->next=q;
        return pHead1;
    }
};

 

递归:

public class Solution {
 public ListNode Merge(ListNode list1, ListNode list2) {
 if(list1==null)
 return list2;
 else if(list2==null)
 return list1;
 ListNode mergeHead=null;
 if(list1.val<list2.val){
 mergeHead=list1;
 mergeHead.next=Merge(list1.next, list2);
 }
 else{
 mergeHead=list2;
 mergeHead.next=Merge(list1, list2.next);
 }
 return mergeHead;
 
 }
}

 

posted @ 2016-04-13 17:52  0giant  阅读(255)  评论(0编辑  收藏  举报