/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include<queue>
using namespace std;
//给优先级队列定义比较函数。让其从小到大
struct cmp {
    bool operator()(const ListNode *a, const ListNode *b){
        return a->val > b->val; 
    }
};

class Solution {
public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        ListNode L(0);
        ListNode *tail = &L;
        priority_queue<ListNode *, vector<ListNode*>,cmp> Q;
        //队列首部放入堆
        for(auto &nd : lists){
            if(nd == nullptr){
                continue;
            }
            Q.push(nd);
        }
        while(!Q.empty()){
            //堆顶弹出的是最小的
            auto top = Q.top();
            Q.pop();
            if(top->next != nullptr){
                //当前链表的下一个元素插入堆
                Q.push(top->next);
            }
            //构造结果队列
            tail->next = top;
            top->next = nullptr;
            tail = top;
        }
        return L.next;
    }
};