K個のソート・チェーン・テーブルのマージ--優先キューの解決
12550 ワード
0x01.に質問
k個のソートチェーンテーブルをマージし、マージ後のソートチェーンテーブルを返します.入力例:[1->4->5,1->3->4,2->6]出力例:1->1->2->3->4->5->6
この問題は、前の問題のアップグレード版と2つの順序付きチェーンテーブルを統合することです.
0x02.簡単な分析
前の問題とは異なり、今回要求されたのは
しかし、基本的な考え方は変わらず、それぞれの中から最小値を出して、結果チェーンテーブルに追加します.
しかし、チェーン時計が多いことを考えると、暴力の取り出しは望ましくないに違いない.
1つの考え方は、複数のチェーンテーブルを最終的に2つのチェーンテーブルの合併に変換することです.これは実は分治の考え方であり、間違いなく可能です.ここでは、より理解しやすい解決策を使用します.
最も暴力的な考え方は、すべてのチェーンテーブルを配列に変換することです.目的は何ですか.順序を簡単にするためです.では、私たちは遍歴するときに順序をつけることができますか.つまり、秩序のある容器に入れることができます.間違いなく、優先キューはできます.私たちは小さなトップスタック、つまり最小値の優先キューを維持することができます.まずノードを優先キューに入れ、取り出すたびに次のノードを優先キューに入れます.優先キューの優先度の関係で、入れたデータは秩序化されます.これにより、キューの先頭から1つの要素を取り出して結果チェーンテーブルに入れればいいのです.
優先キューの助けを借りて、この問題は非常に簡単になり、絶えず入隊して出なければならない限り、このソートプロセスが完了します.
0x03.解決コード–優先キュー
ATFWUS --Writing By 2020–03–23
k個のソートチェーンテーブルをマージし、マージ後のソートチェーンテーブルを返します.入力例:[1->4->5,1->3->4,2->6]出力例:1->1->2->3->4->5->6
この問題は、前の問題のアップグレード版と2つの順序付きチェーンテーブルを統合することです.
C++ :
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
C++ : ListNode* mergeKLists(vector<ListNode*>& lists)
0x02.簡単な分析
前の問題とは異なり、今回要求されたのは
k
個のチェーンテーブルのソートであり、2つのチェーンテーブルのソートだけではない.しかし、基本的な考え方は変わらず、それぞれの中から最小値を出して、結果チェーンテーブルに追加します.
しかし、チェーン時計が多いことを考えると、暴力の取り出しは望ましくないに違いない.
1つの考え方は、複数のチェーンテーブルを最終的に2つのチェーンテーブルの合併に変換することです.これは実は分治の考え方であり、間違いなく可能です.ここでは、より理解しやすい解決策を使用します.
最も暴力的な考え方は、すべてのチェーンテーブルを配列に変換することです.目的は何ですか.順序を簡単にするためです.では、私たちは遍歴するときに順序をつけることができますか.つまり、秩序のある容器に入れることができます.間違いなく、優先キューはできます.私たちは小さなトップスタック、つまり最小値の優先キューを維持することができます.まずノードを優先キューに入れ、取り出すたびに次のノードを優先キューに入れます.優先キューの優先度の関係で、入れたデータは秩序化されます.これにより、キューの先頭から1つの要素を取り出して結果チェーンテーブルに入れればいいのです.
優先キューの助けを借りて、この問題は非常に簡単になり、絶えず入隊して出なければならない限り、このソートプロセスが完了します.
0x03.解決コード–優先キュー
class Solution {
public:
struct mycomp{
bool operator()(ListNode* a,ListNode* b){
return a->val>b->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, mycomp> queue;
for(ListNode*head:lists){
if(head) queue.push(head);
}
ListNode* dummy = new ListNode(-1);
ListNode* temp = dummy;
while(!queue.empty()){
ListNode* p = queue.top();
queue.pop();
if(p->next) queue.push(p->next);
temp->next=p;
temp=temp->next;
}
return dummy->next;
}
};
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists==null || lists.length==0) {
return null;
}
// ,
PriorityQueue<ListNode> queue = new PriorityQueue(new Comparator<ListNode>() {
public int compare(ListNode o1, ListNode o2) {
return (o1.val - o2.val);
}
});
// ,
for(int i=0;i<lists.length;i++) {
while(lists[i] != null) {
queue.add(lists[i]);
lists[i] = lists[i].next;
}
}
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
// ,
while( !queue.isEmpty() ) {
dummy.next = queue.poll();
dummy = dummy.next;
}
dummy.next = null;
return head.next;
}
}
ATFWUS --Writing By 2020–03–23