劍指offer(16)

題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。

時間限制:1秒 空間限制:32768K 熱度指數:276846
本題知識點: 鏈表

方法1:同時比較着遍歷兩個鏈表,生成一個新的合併鏈表,注意後面將沒有遍歷完全的鏈表直接鏈接到新鏈表後方即可。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* p1=pHead1;
        ListNode* p2=pHead2;
        ListNode* head=NULL;
        ListNode* tail=NULL;


        if(p1==NULL&&p2==NULL)
            return NULL;
        if(p1==NULL)
            return p2;
        if(p2==NULL)
            return p1;

        if(p1->val>=p2->val){
            head=tail=p2;
            p2=p2->next;
        }
        else{
            head=tail=p1;
            p1=p1->next;
        }
        while(p1!=NULL&&p2!=NULL){
            if(p1->val>=p2->val){
                tail->next=p2;
                tail=p2;
                p2=p2->next;
            }
            else{
                tail->next=p1;
                tail=p1;
                p1=p1->next;
            }
        }

        if(p1!=NULL){
            tail->next=p1;
        }
        if(p2!=NULL){
            tail->next=p2;
        }

        return head;

    }
};

方法2:遞歸方法

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* p1=pHead1;
        ListNode* p2=pHead2;
        ListNode* tmp=NULL;

        if(p1==NULL&&p2==NULL)
            return NULL;
        if(p1==NULL)
            return p2;
        if(p2==NULL)
            return p1;

        if(p1->val>=p2->val){
            tmp=p2;
            tmp->next=Merge(p2->next,p1);
        }
        else{
            tmp=p1;
            tmp->next=Merge(p1->next,p2);
        }


        return tmp;

    }
};

方法3:將兩個鏈表中的元素放入一個vector容器中,然後將元素進行重排序,再將元素存入一個新的鏈表中。

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        vector<int> v;
        ListNode* p1=pHead1;
        ListNode* p2=pHead2;
        ListNode* tmp=NULL;
        ListNode* newList=NULL;

        if(p1==NULL&&p2==NULL)
            return NULL;
        if(p1==NULL)
            return p2;
        if(p2==NULL)
            return p1;

        while(p1!=NULL){
            v.push_back(p1->val);
            p1=p1->next;
        }
        while(p2!=NULL){
            v.push_back(p2->val);
            p2=p2->next;
        }

        sort(v.begin(),v.end(),greater<int>());
        //sort(A,A+100,greater<int>());//降序排列
        //sort(A,A+100,less<int>());//升序排列

        for(int i=0;i<v.size();i++){
            tmp=new ListNode(v[i]);
            tmp->next=newList;
            newList=tmp;
        }
        return newList;

    }
};

參考博客:https://blog.csdn.net/happyjacob/article/details/80603423

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章