题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
分析
合并k个已排序链表为一个链表,利用优先队列和仿函数构造最小堆,需要注意仿函数的应用场景,在sort等可以排序的算法中,以及set,map,priority_queue等可排序的容器中可以使用。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct cmp{
bool operator()(ListNode* l1,ListNode* l2){//自定义比较函数,优先队列中,比较结果与排序相反,即>对应升序,<对应降序
return l1->val>l2->val;
}
};
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*,vector<ListNode*>,cmp> heap;//利用优先队列和仿函数构造最小堆
ListNode* res=NULL;
ListNode* cur=NULL;
if(lists.empty())
return res;
for(auto i:lists){//对于不为空的list,压入链表头后,会根据节点的值自动排序
if(i!=NULL)
heap.push(i);
}
while(!heap.empty()){//当最小堆不为空时,循环弹出最小值的链表指针,加入合并后的链表,并压入该节点的下一个节点
ListNode* p=heap.top();
heap.pop();
if(p->next!=NULL){
heap.push(p->next);
}
if(cur==NULL){//合并后链表为空时,对头节点进行初始化
cur=p;
res=cur;
}
else{//否则链上p,并移动cur
cur->next=p;
cur=cur->next;
}
}
return res;
}
};