leetcode 23 合併K排序鍊錶

2021-10-01 17:08:39 字數 889 閱讀 4432

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:輸入:

[1->4->5,

1->3->4,

2->6

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

解析:看到這一題,馬上就能想到之前的合併兩個鍊錶leetcode_21.合併兩個有序鍊錶

這一題相當於上一題的公升級版,從合併的實現方法上來說可以參照上一題。

問題在於合併的順序,最簡單的方法是按照順序一一合併,第一題合併1和2,然後將合併後的新1和3合併,然後是1和4。這樣雖然簡單,但是相當於第一條鍊錶合併了k次,第二條鍊錶合併了k-1次,太多次重複的合併操作大大增加了運算時間。

我們可以採用分治的思想,每次合併操作可以分解為將前半部分合併與將後半部分合併,而子合併操作同樣可以分解,一直到僅剩一條或者兩條鍊錶合併。此時每條鍊錶相當於合併了log2k次,複雜度從o(n2)降到了o(nlogn)。

有什麼辦法可以快速有效的實現分治演算法呢,我們想到了佇列。將整個陣列按順序放入佇列,每次取出佇列前兩個鍊錶,並將合併後的新鍊錶插入佇列尾。這樣不需要額外的判斷便自然實現了分治演算法。

class

solution

return tmp.

front()

;}private

: listnode*

mergetwolists

(listnode* l1, listnode* l2)

else

pre = pre-

>next;

} pre-

>next =

(l1?l1:l2)

;return head-

>next;}}

;

LeetCode 23 合併 K個排序序列

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...

Leetcode23 合併K個排序鍊錶

題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...

leetcode 23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6分析 我想是k次歸併。時間複雜度是 k 1 nlogn。題目分析 本題首先將每個鍊錶的首元素取出,構建乙個最小堆。堆頂則為最小的元素,用最小元素所在...