传说中的K路归并排序问题,显然我们应该用一个最小堆来维护K个链表头里的最小值。
因此这个题的关键就变成了,如何使用STL里的优先队列。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct NodeCmp {
bool operator() (const ListNode *a, const ListNode *b) {
return a->val > b->val;
}
};
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
if (lists.size() == 0)
return NULL;
ListNode *fake = new ListNode(-1);
ListNode *pre = fake;
priority_queue<ListNode *, vector<ListNode *>, NodeCmp> pq;
for (int i = 0; i < lists.size(); ++i)
if (lists[i] != NULL)
pq.push(lists[i]);
while (!pq.empty()) {
ListNode *t = pq.top();
pq.pop();
if (t->next != NULL)
pq.push(t->next);
pre->next = t;
pre = t;
t->next = NULL;
}
return fake->next;
}
};
http://oj.leetcode.com/problems/merge-k-sorted-lists/