力扣-21-合併兩個有序連結串列/劍指Offer-25-合併兩個排序的連結串列
阿新 • • 發佈:2022-04-19
編碼思路
首先是遞迴排序過程
- 比較兩個連結串列的頭節點大小,將更小的節點作為結果連結串列的頭節點,並將這個節點從原連結串列中刪除
- 遞迴地重複上述過程,直到兩個連結串列都為空
要注意的情況是
- 當兩個連結串列中某一個/全都為空
- 某一個連結串列的節點被一個個取出後變成了空連結串列
好像還沒用過STL-list,簡單去學習下
- STL-list為雙向連結串列
- 不能通過下標直接訪問人元素
實際場景中,如何需要對序列進行大量新增或刪除元素的操作,而直接訪問元素的需求卻很少,這種情況建議使用 list 容器儲存序列。
- 可以拷貝容器
std::list<int> value1(10); std::list<int> value2(value1);
- 通過拷貝其他型別容器(或者普通陣列)中指定區域內的元素,可以建立新的 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; } };
寫了一個小時沒寫出來,著實拉跨
覆盤一下,這也是第一次寫連結串列相關的題吧,最關鍵的是:沒有理解到方法返回值——節點指標的對於解體意義。
本來口口聲聲說遞迴,結果寫著寫著就跑去絞盡腦汁寫迴圈了