這題「合併兩個已排序的鏈結串列」要求將兩個已經按照非遞減順序排序好的鏈結串列list1和list2合併成一個新的、同樣排序好的鏈結串列。
最終結果必須是透過拼接(splicing)原有的節點來構成,而不是創造全新的節點,並返回這個新的已合併鏈結串列的頭節點。
由於兩個輸入的鏈結串列都已排序,解題可以使用稱為雙指針迭代的方法來高效地完成合併,其核心思路是先創建一個特殊節點(例如:值為0),作為新合併鏈結串列的起點(就是虛擬節點頭)。這是處理鏈結串列合併或操作時的常見技巧。這樣做的好處是,不需要在合併開始時處理新鏈結串列頭節點的特殊情況,使代碼更簡潔。
接著,維護一個當前指針(current Pointer):這個指針(被稱之為current或tail)永遠指向新鏈結串列中最後一個已連接的節點。
在list1和list2兩個鏈結串列都沒有到達末尾時,要比較它們當前節點的值,並與虛擬頭節點連接,以下是其步驟:
1.比較當前節點的值,並選擇值較小的那個節點。
2.將current指針的next屬性指向這個較小的節點。
3.將被選中鏈結串列的指針向前移動一位。
4.將current指針也向前移動到剛剛連接的新節點。
當其中一個鏈結串列完全被遍歷完(即指針變為null)時,另一個鏈結串列中剩餘的所有節點(它們必然已經是排序好的)可以直接全部連接到current指針的後面。
最終,合併鏈結串列的頭節點就是虛擬頭節點的next。