题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

思路:
根据题目可知,同一个链表内部是排好序的,无需再进行比较,所以只需要比较不同链表中的元素大小即可。这里考虑使用priority_queue优先队列,优先队列内部是通过堆排序的方法实现了有序。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//仿射函数:实际上是定义一个结构体,并在内部实现一个operator()方法,使其具有函数的功能
//在结构体内写一个仿射函数效率高
//优先级队列是反着排序的
struct cmp{
bool operator()(ListNode* a,ListNode* b){
return a->val>b->val;
}
};

ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return NULL;
priority_queue<ListNode*,vector<ListNode*>,cmp> pq;
ListNode* head=new ListNode(-1);
ListNode* p=head;
for(auto it:lists){
if(it){
pq.push(it);
}
}
while(!pq.empty()){
ListNode* now=pq.top();
pq.pop();
p->next=now;
p=p->next;
if(now->next)
pq.push(now->next);
}
return head->next;
}
};