Merge k Sorted Lists

题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.


思路:

本题使用优先队列,所有的链表按照第一个数字的大小排进去,

然后进入一个循环,每次出来的都是最小的,再存放进去一个链表。

如此循环反复。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
private:
    class Comp{
        public:
        bool operator()(const ListNode *l1,ListNode *l2){
            return l1->val>l2->val;
        }
    };

public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if(lists.empty())   return NULL;
        
        ListNode *dummy=new ListNode(0),*tail=dummy;
        priority_queue<ListNode *,vector<ListNode *>,Comp>pq;
        
        for(int i=0;i<lists.size();i++){
            if(lists[i])    pq.push(lists[i]);
        }
        
        while(!pq.empty()){
            ListNode *tmp=pq.top();pq.pop();
            if(tmp->next)   pq.push(tmp->next);
            tail->next=tmp;
            tail=tail->next;
        }
        //pq优先队列里面已经是最大堆,每一个链表的第一个数都是按照最大的顺序排列。
        ListNode *head=dummy->next;
        delete dummy;
        return head;
    }
};


原文地址:https://www.cnblogs.com/jsrgfjz/p/8519836.html