解题思路
如果是合并两个有序链表:
两个指针分别指向第一个元素,比较大小,将小的选出来,指针后移
合并k个有序链表
比较k个链表中的第一个元素,取出最小的,然后指针后移。
每次都要取出最小的元素,然后插入新的元素,用优先队列实现。
优先队列底层是大顶堆/小顶堆,获取顶部元素O(1),插入和删除元素O(logk),每一个元素被插入一次,删除一次,时间复杂度为 O ( k n l o g k ) O(knlogk) O(knlogk),最多有 k n kn kn个顶点。
代码
class Solution {
public:
struct cmp{
bool operator()(ListNode* p,ListNode* q){
return p->val > q->val;//小的优先级高
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* head = new ListNode;
ListNode* tmp = head;
priority_queue<ListNode*,vector<ListNode*>,cmp> q;
for(auto node : lists)if(node)q.push(node);
while(!q.empty()){
ListNode* p = q.top();
q.pop();
tmp->next = p;
tmp = tmp->next;
if(p->next)q.push(p->next);
}
return head->next;
}
};