劍指offer:合併兩個鏈表 在線練習

題目:

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

思路已經寫在代碼註釋裏面了:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
// 1)異常輸入的處理
// 2)1方爲空時候
// 3)均不爲空的時候,定義一個指針result, 用於指向最後的鏈表
// 4)將兩個鏈表中最小的節點鏈接到result中,此處爲了方便我們直接修改pHead1,怕Head2
// 5)如果其中一個已經遍歷完了該怎麼辦
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1 == nullptr) return pHead2;
        if(pHead2 == nullptr) return pHead1;
        ListNode* result = nullptr;  // 初始化一個指針
        ListNode* resultHead = nullptr;  // 初始化一個指針
        while(pHead1 != nullptr && pHead2 != nullptr) //兩個鏈表有一個爲空就退出
        {
            if(result == nullptr) {
                if(pHead1->val < pHead2->val) {
                    result = pHead1;
                    pHead1 = pHead1->next;
                } else {
                    result = pHead2;
                    pHead2 = pHead2->next;
                }
                resultHead = result;
            } else {
                while(pHead1!=nullptr && pHead2->val > pHead1->val) {
                    result->next = pHead1;
                    pHead1 = pHead1 ->next;
                    result = result->next;
                }
                if(pHead1 == nullptr) break;
                while(pHead2!=nullptr && pHead2->val <= pHead1->val) {
                    result->next = pHead2;
                    pHead2 = pHead2->next;
                    result = result->next;
                }
            }
        }
        if(pHead1!=nullptr) result->next = pHead1; //說明pHead1還有節點
        else result->next = pHead2;
        return resultHead;//說明pHead1還有節點
    }
};

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