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