LeetCode 第23題 Merge k Sorted Lists(Java)
原題地址: https://leetcode.com/problems/merge-k-sorted-lists/
這道題的題目是合併k個有序的連結串列,標定難度為 Hard ,詳細需求:
合併k個有序的連結串列,返回一個新的有序連結串列。
例子:
Input:
1->4->5,
1->3->4,
2->6
Output:1->1->2->3->4->4->5->6
邏輯不復雜,合併k個有序連結串列,我想不出來怎麼一次性合併k個連結串列,貌似也不是不可以,但是程式碼感覺有點亂。但是更簡單的方法就是反正我們剛做過21題,所以我們知道怎麼合併兩個有序連結串列。我們就一次合併兩個有序連結串列,最後合併完全部的連結串列。這道題我們提供暴力解法和分而治之兩種解法。
暴力解法
思路很簡單一個for迴圈一個一個連結串列的去合併。總共需要合併k-1次。程式碼裡面直接呼叫了 21題的mergeTwoLists方法 :

分而治之解法
分而治之怎麼解這道題呢?其實大概一想就知道了,就是把問題分成兩半,然後把子問題再分成兩半,直到問題小到只剩兩個連結串列,然後再返回一步一步合併結果。分析完了你會發現這個問題跟歸併排序(Merge-Sort)的思路是一樣的。所以,我們的解法就完全模仿了《演算法導論》的歸併排序的寫法。那麼複雜度也就是nlog(n).

程式碼地址: https://github.com/tinyfool/leetcode/tree/master/src/p0023
這道題是分而治之,如果你對分而治之演算法本身不太熟悉,請參閱《演算法導論》。《演算法導論》一書在2.3.1章節介紹了Merge Sort(歸併排序),在第4章“分而治之”介紹了4.1 the maximum-subarray problem(最大子陣列問題),4.2 Strassen’s algorithm for matrix multiplication (Strassen的矩陣乘法演算法)。
也請參閱我的文章《 LeetCode專題 分而治之 》,文章中實現了演算法導論裡面的這三個分而治之的問題的程式碼,以及LeetCode相關問題的一個列表。