题目描述
解题思路
堆排序
将每个链表中元素放在一起,构造一个元素个数为k的小顶堆,每次取出堆顶元素,构成新的链表。
并把该元素后面的元素加入到堆中,反复操作直到堆为空。
使用优先队列来实现堆,可以方便运算。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct cmp
{
bool operator () (ListNode *a, ListNode *b)
{
return a->val > b->val;
}
};
class Solution
{
public:
ListNode* mergeKLists(vector<ListNode*>& lists)
{
priority_queue<ListNode*, vector<ListNode*>, cmp> que;
for(int i = 0; i < lists.size(); i++)
{
if(lists[i])
que.push(lists[i]);
}
ListNode *head = NULL;
ListNode *pre = NULL;
ListNode *temp = NULL;
while(!que.empty())
{
temp = que.top();
que.pop();
if(!pre) head = temp;
else pre->next = temp;
pre = temp;
if(temp->next) que.push(temp->next);
}
return head;
}
};