题目链接 23. 合并K个排序链表
题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解题思路
第一种方法
把所有的数值都丢入一个链表中,排序后返回值。复杂度O(nklog(kn))。
第二种方法
先把每个链表的头丢入堆中或者是优先队列,然后依次取出,并且把取出来的那个数的下一个数丢进去,这样复杂度是O(nklog(kn))。
//之前觉得第二种更优一点,但是复杂度好像是一样的,可能是自己算错了吧。
这道题不难,主要是复习一下优先队列的定义和操作,然后熟悉一下链表与优先队列的结合。
程序代码
c++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp {
bool operator () (ListNode* a , ListNode* b) {
return a->val > b->val;
//表示排序顺序为从小到大
//只是不太明白为什么在那里是()圆括号,不应该是<或者>号?
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode* ,vector<ListNode*> , cmp> head;//优先队列定义,ListNode* 也是一种类型
for(register int i=0;i<lists.size();++i) {
if(lists[i]!=NULL) {
head.push(lists[i]);
}
}//把每个list的头结点扔进去
ListNode* phead =new ListNode(-1);
ListNode* pcur={phead};
ListNode* top;
while(!head.empty()) {
top=head.top();head.pop();
pcur->next=top;
pcur=pcur->next;
if( top->next != NULL ) head.push(top->next);
}//复习了一下堆(优先队列)的操作
pcur=phead->next;
delete phead;
return pcur;//返回指针
}
};
参考博客
c++优先队列(priority_queue)用法详解
for(auto &a :b) 循环的另一种用法
[C++] auto 关键字
参考题解
参考一
参考二