104 合併k個排序鍊錶

2021-08-14 18:14:59 字數 1477 閱讀 8306

合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度

樣例

給出3個排序鍊錶[2->4->

null,null,-1->null],返回 

-1->

2->4

->

null

思想:與合併兩個排序鍊錶類似,只不過這個是多個鍊錶

假設有兩個排序鍊錶 1->2->3->null, 2->4->null,

程式具體流程如下

歸併方法(兩兩合併)大神解法,好好體會

我們採用分治的方法來解決這個問題,其有k個鍊錶,不斷將其劃分(partition),再將其歸併(merge)。

劃分的部分並不難,將其不斷分成兩部分,但是需要注意的是可能出現start和end相等的情況,這時候就直接return lists[start]就可以了。

class solution 

//寫遞迴函式時,要先確定遞迴截止的條件,再想如何遞迴

listnode* partition(vector& lists, int start, int end)

int mid = (start + end) / 2;

listnode* l1 = partition(lists, start, mid);

listnode* l2 = partition(lists, mid + 1, end);

mergetwolists(l1, l2);

}兩個排序鍊錶的合併

4、利用堆

我們再來看另一種解法,這種解法利用了

最小堆這種資料結構,我們首先把k個鍊錶的首元素都加入最小堆中,它們會自動排好序。然後我們每次取出最小的那個元素加入我們最終結果的鍊錶中,然後把取出元素的下乙個元素再加入堆中,下次仍從堆中取出最小的元素做相同的操作,以此類推,直到堆中沒有元素了,此時k個鍊錶也合併為了乙個鍊錶,返回首節點即可,**如下:

struct cmp }; 

class solution

listnode *head = null, *pre = null, *tmp = null;

while (!q.empty())

return head;

} };

104 合併k個排序鍊錶

2017.10.16.終於有時間繼續刷刷題了。果然一做鍊錶的題邏輯很清楚,就是這個寫起來就很亂。k個鍊錶就是兩兩的合併就好了。definition for listnode.public class listnode public class solution listnode res lists....

合併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個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。根據思路...