1. 程式人生 > 其它 >【知Leetcode之可追】連結串列的合併

【知Leetcode之可追】連結串列的合併

連結串列的合併

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)。