leetcode23 合并k个排序链表(Hard)

题目来源:leetcode23 合并k个排序链表

题目描述:

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解题思路:

用优先队列实现最小堆。将每个链表的第一个结点加入最小堆中,不断去最小堆的堆顶,就是最小元素,再把最小元素所在链表的下一个结点加入堆中,维护堆的特性,直到所有链表的结点都被取出。

/**
 * 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 *l1,ListNode *l2) const{
            return l1->val>l2->val;
        }
    };
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*,vector<ListNode*>,cmp> pq;//最小堆
        for(int i=0;i<lists.size();i++){
            if(lists[i])
                pq.push(lists[i]);
        }
        ListNode *ans=new ListNode(-1);
        ListNode *temp=ans;
        while(!pq.empty()){
            ListNode *t=pq.top();
            temp->next=t;
            temp=temp->next;
            pq.pop();
            if(t->next) pq.push(t->next);
        }
        return ans->next;
    }
};
原文地址:https://www.cnblogs.com/yjcoding/p/13308756.html