Leetcode Merge k Sorted Lists

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

合并k个排序列表

解题思路是:

取出 k个元素进行堆排序,每次取出最小的元素,插入链表中即可

注意本题利用了c++得优先权队列,优先权队列底层是用堆实现的

注意本题中一个特殊的测试用例是[{}]

注意vector为空时表示为[],而不是[{}],而后者是大小为1的vector,其中元素是空指针

放入优先权队列时进行判断是否为空

放入优先权队列的元素是ListNode *, 而不是int,主要是保持原有链表的地址,避免地址失效,而且放入int话,之后又重新new ListNode(int)开销还是比较大的.

对放入优先权队列中得ListNode*要定义一个比较函数对象,如果不定义的话,比较的是地址大小

class Solution {
public:
    struct cmp{
        bool operator()(const ListNode* a, const ListNode* b) const{
            return a->val > b->val;
        }
    };
    
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if(lists.empty()) return NULL;
        priority_queue<ListNode*,vector<ListNode*>,cmp> pq;
        ListNode *head = new ListNode(0), *pre = head;
        for(int i = 0 ; i < lists.size(); ++ i){
            if(lists[i]) pq.push(lists[i]);
        }
        while(!pq.empty()){
            ListNode* node = pq.top(); pq.pop();
            if(node->next) pq.push(node->next);
            pre->next = node;
            pre = node;
        }
        pre->next = NULL;
        return head->next;
    }
};

 第二种方法是二分的方法,每次取两个ListNode * 进行合并

程序中运用了队列,每次从队列中取出两个元素然后合并,将合并后的元素又放入队列,直到队列只剩小一个元素为止即可

class Solution {
public:
    ListNode *mergeLists(ListNode* p,ListNode* q){
        ListNode* head = new ListNode(0),*pre = head;
        while(p && q){
            if(p->val < q ->val){
                ListNode *tmp = p->next;
                p->next = pre->next;
                pre->next = p;
                pre = p;
                p = tmp;
            }else{
                ListNode *tmp = q->next;
                q->next = pre->next;
                pre->next = q;
                pre = q;
                q = tmp;
            }
        }
        pre->next = NULL;
        if(p) pre->next = p;
        if(q) pre->next = q; 
        return head->next;
    }

    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if(lists.empty()) return NULL;
        queue<ListNode *> que;
        for(int i = 0 ; i < lists.size(); ++ i){
            if(lists[i]) que.push(lists[i]);
        }
        while(que.size()>1){
            ListNode* p = que.front();que.pop();
            ListNode* q = que.front();que.pop();
            que.push(mergeLists(p,q));
        }
        return que.front();
    }
};

 

posted @ 2014-07-01 23:17  OpenSoucre  阅读(602)  评论(0编辑  收藏  举报