タイトル説明(難易度)
原题链接
マージkはリンクリストをソートし、ソートされたリスト1のようにそれを返します。その複雑さを分析し、説明します。
例:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
アルゴリズム
(分割統治)
N = 6、合わせ0-31-42-5:分割統治アルゴリズムは、例えば、使用して
二つのリンクされたリストをソートマージ実装する前に行われてきました
時間の複雑さがあります :N-リスト数であり、mは二つのリスト内のノードの最大数であります
C ++コード
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
// Divide and Conquer Approach
// odd: n = 5 0-3 1-4 2 k = (n + 1) / 2
// even: n = 6 0-3 1-4 2-5
int n = lists.size();
if (n == 0) return NULL;
while(n > 1) {
int k = (n + 1) / 2;
for (int i = 0; i < n / 2; i ++) {
lists[i] = mergeTwoLists(lists[i], lists[i + k]);
}
n = k;
}
return lists[0];
}
// merge two lists
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
auto dummy = new ListNode(-1);
auto p = dummy;
while(l1 && l2) {
if (l1->val <= l2->val) {
p->next = l1;
p = l1;
l1 = l1->next;
} else {
p->next = l2;
p = l2;
l2 = l2->next;
}
}
if (l1) p->next = l1;
if (l2) p->next = l2;
return dummy->next;
}
};
最後に書かれたブログは思考の知識をまとめたコンピュータサイエンスの分野を中心に、レビューは、私の目標を理解することは容易である各ブログを書くために、:技術と知識を共有することは喜びである、と私はみんなを歓迎します一緒に学習の交換をして、そこにコメントエリアには疑問もありませんが、またあなた(^∀^●)との深い交流を楽しみにすることができます