21 合併兩個有序鍊錶

2021-10-09 19:30:57 字數 1285 閱讀 6583

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

示例:

輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

1.思路1來自leetcode官方題解。自己的思路差不多,但是做了半天還沒解出來,放棄了。官方題解有**,模擬鍊錶的變化,比較直觀。

2.(1)假設兩個鍊錶:a:[1,2,5]和b:[3,4,7]。l1和l2分別是指向ab兩個鍊錶的首結點的指標。

(2)首先定義乙個結點指標head和prepoint,head用來記錄歸併後的鍊錶首結點是誰,它只在初始改變自己的指向一次,往後不再改變自己的指向。prepoint指標在l1和l2中不斷移動,指向下乙個可能需要改變指向的結點。

(3)什麼時候需要改變指向呢?從l1和l2的首結點開始判斷,如果l1首結點小於l2首結點,則prepoint指向l1,此時即head結點指向了l1,並讓l1指向a鍊錶的下一結點,prepoint指向遞增之前的l1結點。繼續判斷l1的下一結點是否小於l2首結點,是則重複上過程。直到l1的當前結點不小於l2的首結點,則讓l1遞增之前的結點(prepoint指向的結點)指向l2,並讓prepoint指向l2的當前結點。

(4)如果a和b有乙個或兩個空鍊錶呢?或者其中某個鍊錶已經遞增到最後乙個了,另外乙個鍊錶還沒有判斷完呢?所以每次迴圈都要判斷鍊錶當前結點不是空結點才執行while迴圈。只要有乙個鍊錶指標指向空(要麼這個鍊錶一開始就是空的,要麼遍歷完最後乙個結點)則不再迴圈,若是後者情況,則此時剩下的結點必定都大於等於已經歸併好的鍊錶,讓prepoint直接指向剩下的結點即可。若是前者(有乙個或兩個鍊錶為空鍊錶),while迴圈一次都不會執行,直接判斷l1是否為空,為空則直接返回l2,不為空則返回l1,都為空返回誰都一樣。

3.官方題解中新建結點物件用的是listnode* head = new listnode(0, nullptr)這種形式,即在堆中為新結點開闢記憶體空間。因為在堆中定義的物件生命週期和程式一樣長,所以用完後需手動釋放,否則容易造成記憶體洩露。我這裡使用在棧中開闢空間的方法,這樣無需手動管理記憶體空間。

class

solution

else

prepoint = prepoint-

>next;

} prepoint-

>next = l1?l1:l2;

return head.next;}}

;

題解有答案,想不出來過程…

21 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 原本想的是用19題的結構陣列那種方法來做 分別遍歷兩個鍊錶,建立結構儲存原始索引,val和指標,氣泡排序這個結構,更新索引,按照索引建立新的n...

21 合併兩個有序鍊錶

合併兩個有序鍊錶 將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4輸出 1 1 2 3 4 4比較簡單,比較大小,重新排序即可。created by hints on 2019 1 9.include using name...

21 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4先確定合併鍊錶第乙個節點 在迴圈中同時遍歷兩個鍊錶,將後面其餘節點逐次比較,依大小次序連線到首節點之後,迴圈結束後可能有乙個鍊錶未遍歷完,將這個鍊錶剩...