1. 程式人生 > 實用技巧 >《劍指offer》面試題12:合併兩個排序的連結串列

《劍指offer》面試題12:合併兩個排序的連結串列

題目描述

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

解題思路分析:

這兩個連結串列都是單調遞增的,合併這兩個連結串列的意思是將這兩個連結串列全部打亂後,再根據從小到大的順序進行重新指向,最後得到一個新的連結串列,我們可以直接使用遞迴的方法來做這個題目,程式碼如下:

class Solution:
    # 返回合併後列表
    #這個遞迴的方法簡直是無敵啊!
    def Merge(self, pHead1, pHead2):
        #判斷連結串列是否存在,如果不存在就返回另外一個連結串列,另一個連結串列必定是單調不減的
if not pHead1: return pHead2 if not pHead2: return pHead1 #採用分治的思想? if pHead1.val < pHead2.val: #已經確定了新連結串列的表頭,那麼我們只需要後面的連結串列即可,因此從phead1的第二個元素開始算,重新整合排序 #因為這個函式一定返回的是一個有序的連結串列的緣故 pHead1.next = self.Merge(pHead1.next, pHead2)
return pHead1 else:#pHead1.val > pHead2.val pHead2.next = self.Merge(pHead1, pHead2.next) return pHead2

因為我們Merge函式返回的一定是一個具有從小到大順序的連結串列,因此我們拿到一個兩組連結串列當中進行走一次比較之後更小的值,直接採用遞迴,將更小值所在的連結串列下一個數值帶入進去Merge函式當中進行遞迴,這樣就可以直接得到最後的結果了,這種解法很難想到,但多刷一刷題目慢慢就有經驗了。