1. 程式人生 > 其它 >力扣-21-合併兩個有序連結串列/劍指Offer-25-合併兩個排序的連結串列

力扣-21-合併兩個有序連結串列/劍指Offer-25-合併兩個排序的連結串列

編碼思路

首先是遞迴排序過程

  1. 比較兩個連結串列的頭節點大小,將更小的節點作為結果連結串列的頭節點,並將這個節點從原連結串列中刪除
  2. 遞迴地重複上述過程,直到兩個連結串列都為空

要注意的情況是

  1. 當兩個連結串列中某一個/全都為空
  2. 某一個連結串列的節點被一個個取出後變成了空連結串列

好像還沒用過STL-list,簡單去學習下

  1. STL-list為雙向連結串列
  2. 不能通過下標直接訪問人元素

實際場景中,如何需要對序列進行大量新增或刪除元素的操作,而直接訪問元素的需求卻很少,這種情況建議使用 list 容器儲存序列。

  1. 可以拷貝容器
    std::list<int> value1(10); std::list<int> value2(value1);
  2. 通過拷貝其他型別容器(或者普通陣列)中指定區域內的元素,可以建立新的 list 容器。
//拷貝普通陣列,建立list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5);
//拷貝其它型別的容器,建立 list 容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::list<int>values(arr.begin()+2, arr.end());//拷貝arr容器中的{13,14,15}

編寫程式碼

題目中給出的是一個單向連結串列,只包含節點值和後指標
啊……所以不關list的事……

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(list1 == nullptr){
            return list2;
            // 這裡list2其實有兩種情況,為空和不為空
            // 但其實無論哪種情況都無所謂
        }else if(list2== nullptr){
            return list1;
        }
        ListNode* head;
        if(list1->val>list2->val){
            head = list2;
            head->next = mergeTwoLists(list1,list2->next);
            // 寫了半天沒寫出來關鍵是沒有理解這個方法的返回值
            // 遞迴地返回:對兩個連結串列的頭節點進行比較後,選擇出的較小元素的指標
        }else{
            head= list1;
            head->next = mergeTwoLists(list1->next,list2);
        }
        return head;
    }
};

寫了一個小時沒寫出來,著實拉跨
覆盤一下,這也是第一次寫連結串列相關的題吧,最關鍵的是:沒有理解到方法返回值——節點指標的對於解體意義。
本來口口聲聲說遞迴,結果寫著寫著就跑去絞盡腦汁寫迴圈了