【LeetCode】23.K个有序链表合并

23. Merge k Sorted Lists

Description:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Difficulty:hard

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

方法1:堆

  • Time complexity : O ( n ∗ l o g ( k ) ) O\left ( n*log(k)\right ) O(nlog(k))
  • Space complexity : O ( n ) O\left ( n \right ) O(n)
    思路
    我们首先把k个链表的首元素都加入最小堆中,它们会自动排好序。然后我们每次取出最小的那个元素加入我们最终结果的链表中,然后把取出元素的下一个元素再加入堆中,下次仍从堆中取出最小的元素做相同的操作,以此类推,直到堆中没有元素了,此时k个链表也合并为了一个链表,返回首节点即可,
struct compare{
    bool operator()(ListNode* a, ListNode* b){        
    return a->val > b->val;
    }
};

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, compare> q;
        for(auto node : lists){
            if(node) q.push(node);
        }
        ListNode *res = new ListNode(-1);
        ListNode *cur = res;
        while(!q.empty()){
            auto top = q.top();
            q.pop();
            cur->next = top;
            cur = cur->next;
            if(cur->next)
                q.push(cur->next);
                
        }
        return res->next;
    }
};
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页