從21. 合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。 這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。
根據思路一,我們是乙個乙個地將有序鍊錶組成新的鍊錶,這裡乙個進行了k-1次兩個有序鍊錶的合併操作。而且隨著新鍊錶越來越大,時間複雜度也會越來越高。 這裡有一種簡化的方式,可以先將k個有序鍊錶先以2個鍊錶為一組進行合併,得出結果後,再將所有的新有序鍊錶繼續上面的方式,2個鍊錶為一組進行合併。直至將所有的有序鍊錶進行合併。 這個思路會比思路一的演算法複雜度少一點。
我們換個不一樣的思路。我們先遍歷一次所有的鍊錶中的元素。然後將元素全部放在乙個陣列裡面。接著對這個陣列進行排序,最終將排序後的陣列裡面的所有元素鏈結起來。 這種方案的複雜度和**量會比前集中思路更好,更簡單。
空間複雜度:因為需要乙個陣列,所以需要額外的空間。這個空間的大小就是鍊錶元素的個數 時間複雜度:假設乙個是n個元素,對鍊錶進行遍歷(n),對陣列進行排序(排序演算法可以達到nlogn),最終鏈結所有元素(n),就是 (n+nlogn+n),也就是o(nlogn)
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:# @param a list of listnode
# @return a listnode
defmergeklists
(self, lists)
: heap =
for node in lists:
if node !=
none
: (node.val, node)
) heapq.heapify(heap)
head = listnode(0)
curr = head
while heap:
curr.
next
= listnode(pop[0]
) curr = curr.
next
if pop[1]
.next
: (pop[1]
.next
.val, pop[1]
.next))
return head.
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個排序鍊錶
題目 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 思路 設定乙個堆,每次把每個鍊錶的頭結點放入堆中。記錄每個節點的值與在原陣列中的位置,便於鍊錶往下走。彈出堆中最小值,把最小值所在位置的陣列...
合併k個排序鍊錶
題目描述 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 之前進行過合併兩個排序鍊錶的做法,在合併k個排序鍊錶的時候,逐步將前兩個鍊錶合併成新的排序鍊錶,再向後不斷延伸,最終合併所有的排序鍊錶。...