Merge k Sorted Lists
本周讲的是分治,所以选的题目也是分治的问题
LeetCode上的23题:https://leetcode.com/problems/merge-k-sorted-lists/description/
题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
题解
分:当要排序的链表大于2时,将链表分成左右两个部分排序,若要排序的链表数为一时,拷贝该链表并返回
治:对两个已排序链表进行排序,返回包含两个链表元素的已排序链表
代码
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.size() == 0) return NULL;
return _mergeKlists(lists, 0, lists.size() - 1);
}
ListNode* _mergeKlists(vector<ListNode*>& lists, int left, int right) {
ListNode* newList = new ListNode(0);
ListNode* cur = newList;
if (left == right) {
ListNode* p = lists[left];
while (p != NULL) {
cur->next = new ListNode(p->val);
p = p->next;
cur = cur->next;
}
}
else {
int mid = (left + right) / 2;
ListNode* l = _mergeKlists(lists, left, mid);
ListNode* r = _mergeKlists(lists, mid + 1, right);
while (l != NULL && r != NULL) {
if (l->val < r->val) {
cur->next = l;
l = l->next;
}
else {
cur->next = r;
r = r->next;
}
cur = cur->next;
}
if (l == NULL) {
cur->next = r;
}
else {
cur->next = l;
}
}
cur = newList->next;
delete newList;
return cur;
}
};
分析
算法将多个排序链表分成两个部分,最后将两个已排序链表合并成一个排序链表,令N为节点总数,k为链表总数。
则算法会经过log2(k)次分治,每次合并链表的时间复杂度为O(N),故总时间为O(log2(k) * N).