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;
            }
        }
    };
  • 相关阅读:
    操盘策略:判断强庄股的四个诀窍
    三类股有望继续走强
    操盘策略:股市空头陷阱五大招数
    每日一招:面对亏损我们应该如何操作(鳄鱼法则)
    (转)一个大户的自白:我是这样被两融打爆的
    3.2、迭代
    3.1、切片
    2.4、递归函数
    2.3、函数的参数
    2.2、定义函数
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5239438.html
Copyright © 2011-2022 走看看