思路:
这道题的话,一开始也能想到,类似于合并两个链表的思想,我只要每次找出n个链表的最小值即可,这样时间复杂度偏高,O(n^2);但是我们可以利用优先队列来做,把每个链表的第一个元素放进优先队列即可,这样每次出队的就是最值,时间复杂度低得多,空间上就浪费的多。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
struct node{
int val;
ListNode* ptr;
};
struct cmp{
bool operator()(const node& a,const node& b)const{
return a.val>b.val;
}
};
priority_queue<node,vector<node>,cmp> q; //优先队列的写法
ListNode* mergeKLists(vector<ListNode*>& lists) {
for(auto i:lists){
if(i) q.push({i->val,i});
}
ListNode head,*tail=&head;
while(!q.empty()){
auto f = q.top();q.pop();
tail->next = f.ptr;
tail = tail->next;
if(f.ptr->next) q.push({f.ptr->next->val,f.ptr->next});
}
return head.next;
}
};