题目描述
https://leetcode-cn.com/problems/merge-k-sorted-lists/
解题思路
类似于外部排序。外部排序主要针对于内存大小小于数据量的情况,整体采用归并排序,在内存中采用堆排序增加每个数据链的长度,从而减少归并排序次数。利用这个思想,我们依次读入排序链表的首结点,利用他们构成一个小顶堆。然后取出最小的数,放入结果链表的尾部,再从最小数的源链表中取出下一个值加入小顶堆中。
小顶堆在 stl 中用优先队列实现功能,优先队列的底层数据结构默认是 vector。基本操作函数有:push/pop/top。
实现
class Solution {
public:
class Status{
public:
ListNode* m_head;
int m_val;
Status(ListNode* head, int val):m_head(head),m_val(val){};
bool operator > (const Status& s) const {
return m_val>s.m_val;
};
};
//调用greater<T>完成排序功能,而greater会调用类型T的>重载运算符
//所以需要保证T类型确实定义过>运算符。greater<T>表示小顶堆
priority_queue<Status, vector<Status>, greater<Status>> q;
ListNode* mergeKLists(vector<ListNode*>& lists) {
for(auto head:lists)
q.push(Status(head,head->val));
ListNode LN, *LNc = &LN;
while(!q.empty())
{
auto cur = q.top();
q.pop();
if(cur.m_head->next)
q.push(Status(cur.m_head->next,cur.m_head->next->val));
LNc->next = cur.m_head;
LNc = LNc->next;
}
return LN.next;
}
};