class Solution {
public:
    struct cmp{
        bool operator()(ListNode *A,ListNode *B){
            return A->val > B->val; // 小跟堆
        }
    };
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if(!lists.size()) return nullptr;
        priority_queue<ListNode*, vector<ListNode*>, cmp> pq; // 重写仿函数 
//priority_queue<Type, Container, Functional>Type 就是数据类型,Functional 就是比较的方式。
//Container 就是容器类型(Container必须是用数组实现的容器比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
        for(auto it : lists){
            if(it)pq.push(it); // 链表不能为空
        }
        ListNode *ans = new ListNode(0);
        ListNode *p = ans;
        p->next = NULL;
        while(!pq.empty()){
            ListNode *tmp = pq.top(); // 优先队列第一个链表
            pq.pop(); // 出队
            if(tmp->next)pq.push(tmp->next);
            p->next = tmp;
            p = p->next;
        }
        p->next = NULL;
        return ans->next;
    }
};