• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ArgenBarbie
博客园    首页    新随笔    联系   管理    订阅  订阅
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;
        }
    }
};

 

posted on 2016-03-03 17:26  ArgenBarbie  阅读(179)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3