題目描述:
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
示例:
輸入:
[ 1->4->5,
1->3->4,
2->6
]輸出: 1->1->2->3->4->4->5->6
解題思路:
你是否還記得這道題的簡單版本《leetcode 21.合併兩個有序鍊錶》。對這道題的思路就是將21延伸一下。我們使用歸併排序的思想,將多個鍊錶拆分開。最後變成兩個兩個鍊錶去合併,結果就出來啦。
class
solution
vector> l2;
l2.resize
(lists.
size()
- mid)
;for
(size_t i = mid; i < lists.
size()
; i++
)return
merge2lists
(mergeklists
(l1)
,mergeklists
(l2));
}
listnode*
merge2lists
(listnode *l1, listnode *l2)
else
return head;}}
;
解題思路:
c++stl庫里有乙個容器priority_queue這是乙個優先佇列。它實際就是乙個堆的容器。那麼這道題我們可以用這個容器先將所有的結點插入,然後該容器會自動構件乙個堆。我們只需要寫乙個lambda表示式來進行比較,來讓它構件乙個小堆。之後每次取堆頂結點連起來就行。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
; priority_queue, vector>
,decltype
(cmp)
>
pq(cmp)
;for
(const
auto
& e : lists)
} listnode *head =
nullptr
; listnode *cur =
nullptr
;while
(!pq.
empty()
)else
}return head;}}
;
這個方法的難點就在於lambda表示式的應用。 分治實現LeetCode 23題 合併K個排序鍊錶
紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...
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...