刷題之合併K個排序鍊錶

2021-10-01 08:43:02 字數 989 閱讀 2624

題目:合併 k 個排序鍊錶,返回合併後的排序鍊錶。

示例:

輸入:

[1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

思路一

從21. 合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。 這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。

思路二根據思路一,我們是乙個乙個地將有序鍊錶組成新的鍊錶,這裡乙個進行了k-1次兩個有序鍊錶的合併操作。而且隨著新鍊錶越來越大,時間複雜度也會越來越高。 這裡有一種簡化的方式,可以先將k個有序鍊錶先以2個鍊錶為一組進行合併,得出結果後,再將所有的新有序鍊錶繼續上面的方式,2個鍊錶為一組進行合併。直至將所有的有序鍊錶進行合併。 這個思路會比思路一的演算法複雜度少一點。

思路三(推薦)

我們換個不一樣的思路。我們先遍歷一次所有的鍊錶中的元素。然後將元素全部放在乙個陣列裡面。接著對這個陣列進行排序,最終將排序後的陣列裡面的所有元素鏈結起來。 這種方案的複雜度和**量會比前集中思路更好,更簡單。

空間複雜度:因為需要乙個陣列,所以需要額外的空間。這個空間的大小就是鍊錶元素的個數 時間複雜度:假設乙個是n個元素,對鍊錶進行遍歷(n),對陣列進行排序(排序演算法可以達到nlogn),最終鏈結所有元素(n),就是 (n+nlogn+n),也就是o(nlogn)。

思路四偷懶方法,使用內建庫heapq,最小堆, 每個list有乙個指標, k個指標放入堆中, 每次pop出最小的, 然後指向相應list的下乙個node, 再push入堆。

最小堆是乙個陣列, 所有元素滿heap[k] <= heap[2*k+1]heap[k] <= heap[2*k+2], heap[0]即堆頂最小。

刷題 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 拿到題按照規矩,首先先暴力一遍,把拿到的資料全部放進陣列sort一下,然後放進乙個鍊錶 ps 太久沒有接觸鍊錶了,幾乎忘完了.寫next的時候還在...

合併k個排序鍊錶

合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度。樣例 給出3個排序鍊錶 2 4 null,null,1 null 返回 1 2 4 null 兩兩合併 合併ab得到c 合併cd得到e definition for listnode.public class listnode pu...

合併K個排序鍊錶

從21.合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。根據思路...