leetcode 23. Merge k Sorted Lists(Hard)

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

Algorithm:
本题为一个多路归并的问题,即将多个有序数组或链表(统称为序列)合并成为一个有序的序列。
回想归并排序中二路归并时我们的做法。我们从两个序列的头部元素开始比较(即当前下标为0),将较小者加入一个新的序列中,同时拥有较小元素序列的当前下标加1。每次比较的复杂度为O(1),总体复杂度为O(n)。
对于k路归并,我们同样可采用上述方法,即遍历所有序列,找出最小元素加入新序列,同时相应下标加1。该时间复杂度为O(kn)。
然而,该算法可以进行优化。因为查找最小元素的过程我们可以通过建堆来处理。这样,我们只需要用O(logk)的时间即可找到最小元素,因此,总时间复杂度可优化为O(nlogk)。

Code:

#include<iostream>
#include<functional>
#include<queue>
using namespace std;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

struct cmp{  
    bool operator ()(ListNode* n1, ListNode* n2){  
        return n1 -> val > n2 -> val;  //最小值优先 
    }  
}; 

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* head = new ListNode(0);  //建表头 
        ListNode* tp = head;

        priority_queue<ListNode*, vector<ListNode*>, cmp > que;
        //使非空链表表头元素进队 
        for(int i = 0; i < lists.size(); ++ i) {  
            if(lists[i])
                que.push(lists[i]);
        }

        while(que.size()) {
            ListNode* temp = que.top(); 
            que.pop();

            //将表头结点加入答案链表
            tp -> next = temp;
            tp = tp -> next;

            //当前链表非空,则将下一结点推入队列 
            if(temp -> next) que.push(temp -> next);
        }
        tp = head -> next;                //删表头 
        delete head;        

        return tp;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值