合并 k k k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解1:利用合并两个有序链表的思想,对 K K K个排序链表顺序合并
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge(ListNode* head1, ListNode* head2) {
if (head1 == nullptr)
return head2;
if (head2 == nullptr)
return head1;
ListNode* pMergeHead = nullptr;
if (head1->val < head2->val) {
pMergeHead = head1;
pMergeHead->next = merge(head1->next, head2);
}
else {
pMergeHead = head2;
pMergeHead->next = merge(head1, head2->next);
}
return pMergeHead;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.size() == 0)
return nullptr;
if (lists.size() == 1)
return lists[0];
ListNode* head1 = lists[0];
ListNode* head2 = lists[1];
ListNode* mergeHead = merge(head1, head2);
ListNode* next;
for (int i = 2; i < lists.size(); ++i) {
next = merge(mergeHead, lists[i]);
mergeHead = next;
}
return mergeHead;
}
};
解2:利用优先队列将链表构造成小顶堆,然后将其串连成新链表
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp {
bool operator()(ListNode* l1, ListNode* l2) {
return l1->val > l2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* res = new ListNode(0);
ListNode* resTmp = res;
//构造小顶堆
priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
for (int i = 0; i < lists.size(); ++i) {
if (lists[i])
pq.push(lists[i]);
}
while (!pq.empty()) {
resTmp->next = new ListNode(pq.top()->val);
resTmp = resTmp->next;
ListNode* topnext = pq.top()->next;
pq.pop();
if (topnext) {
pq.push(topnext);
}
}
return res->next;
}
};