【知Leetcode之可追】連結串列的合併
阿新 • • 發佈:2021-11-04
連結串列的合併
LeetCode 23 合併K個升序連結串列
題意解讀
有K個升序的連結串列,把它們合併成一個連結串列。
解決方案一
解題思路
- 先實現兩個升序連結串列合併的函式,再將K個升序連結串列逐一合併。
複雜度分析
- 時間複雜度:若連結串列長為n,第一次合併n個元素,第二次2n,第三次3n,以此類推,得O(K2n)。
- 空間複雜度:所需額外空間與連結串列長度無關,為O(1)。
解決方案二
解題思路
- 對解決方案一進行優化,採用分治方法,減少合併次數。
- 先實現兩個升序連結串列合併的函式。
- 合併K個連結串列,即合併兩個K/2的連結串列,逐層遞迴。
複雜度分析
- 時間複雜度:若連結串列長為n,第一次合併K/2對連結串列,每一對共有2n個元素,第二次合併K/4對連結串列,每一對有4n個元素,以此類推,共合併log(K)次,即 O(Knlog(K))。
- 空間複雜度:每遞迴一次,則需要佔用一部分記憶體儲存結果,因此為 O(log(K))。
解決方案三
解題思路
- 模仿兩升序連結串列合併的過程,即每次從各個連結串列中選取一個最小的結點,掛到結果連結串列上。
- 選取最小結點的過程可以利用優先佇列實現,其底層原理為堆排序,每次插入刪除會自動排序以實現頭元素為優先順序最高的元素。
- 將各個連結串列頭結點入隊,每次彈出頭元素,並將其下一個結點入隊,直到彈出全部元素。
複雜度分析
- 時間複雜度:堆排序每次調整的時間複雜度為 O(log(K)),一共Kn個元素,故為 O(knlog(K))。
- 空間複雜度:需要設定一個最大長度為K的優先佇列,故為 O(K)。