zoukankan      html  css  js  c++  java
  • 23. Merge k Sorted Lists

    合并k个有序列表。

    (1)堆排序

    bool cmp(ListNode *l1,ListNode *l2){
        return l1->val > l2->val;
     }
    class Solution {
    public:
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            vector<ListNode*> validLists;
            for(auto i:lists)
                if(i) validLists.push_back(i);
            ListNode *pre = new ListNode(-1);
            ListNode *curr = pre;
            make_heap(validLists.begin(),validLists.end(),cmp);
            while(!validLists.empty()){
                ListNode *top = validLists.front();
                pop_heap(validLists.begin(),validLists.end(),cmp);
                validLists.pop_back();
                curr->next = top;
                curr = curr->next;
                top = top->next;
                if(top){
                    validLists.push_back(top);
                    push_heap(validLists.begin(),validLists.end(),cmp);
                }
            }
            return pre->next;
        }
    };

    (2)两两合并

    //merge two lists recursive version
    
    //time complexity: O(klogk)
    class Solution {
    public:
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            if (lists.size() == 0) return NULL;
            int n = lists.size();
            return merge(lists, 0, n - 1);
        }
    
        ListNode * merge(vector<ListNode *>& lists, int begin, int end) {
            if (begin > end) return NULL;
            if (begin == end) return lists[begin];
            if (begin + 1 == end) return mergeTwoList(lists[begin], lists[end]);
            int mid = begin + (end - begin) / 2;
            ListNode * firstHalf = merge(lists, begin, mid);
            ListNode * secondHalf = merge(lists, mid + 1, end);
            return mergeTwoList(firstHalf, secondHalf);
        }
    
        ListNode* mergeTwoList(ListNode* l1, ListNode* l2) {
            if (l1 == NULL) return l2;
            if (l2 == NULL) return l1;
            if (l1->val < l2->val) {
                ListNode * head = l1;
                head->next = mergeTwoList(l1->next, l2);
                return head;
            } else {
                ListNode * head = l2;
                head->next = mergeTwoList(l1, l2->next);
                return head;
            }
        }
    };
  • 相关阅读:
    第一篇随笔
    我的第一篇博客
    第一次博客
    芜湖
    芜湖~
    起飞
    第一天
    第一篇随笔
    第一篇随笔
    随笔
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5239438.html
Copyright © 2011-2022 走看看