leetcode 23. Merge k Sorted Lists

这道题目就是注明的K sort问题。和彩虹排序一样,出自名门。常考题目。

既然是k sort merge, 就能用典型的merge 算法。 于是就有了一下几个办法

1. 两两merge成一个链表,然后再重复这个过程。直到就一个链表。

        while(lists.size() >1){
            vector<ListNode*> newLists;
            int size = lists.size();

            for(int i = 0; i+1< size;i=i+2){
                ListNode* tmp = mergeTwoList(lists[i], lists[i+1]);
                newLists.push_back(tmp);
            }

            if(size %2 == 1)
                newLists.push_back(lists[size - 1]);

            lists = newLists;
        }

但是这样做会超时。。。。。。 因为时间复杂度比较高。

首先logN的for循环。 每一个勋魂都是N。 一共是NlogN

2)用merge sort的思路。

mergeHelper(lists, 0, lists.size()-1);

    ListNode* mergeHelper(vector<ListNode*>& lists, int start, int end) {
        if(start == end)
            return lists[start];
        
        int mid = start + (end -start)/2;
        
        
        ListNode* left = mergeHelper(lists, start, mid);
        ListNode* right = mergeHelper(lists, mid + 1, end);
        
        return mergeTwoList(left, right);
    }

结果 也是超时了。。。。

3)优先队列。。。。

每次把最小的放到top里。然后靠优先队列把每个ListNode 排好序。

N次push进PQ,然后PQ排序时间暂时不知道。估计也是LogK时间长度。

我觉得最难的是priority_queue 的cmp 写法。竟然是个struct。。。。

百思不得其解。。。。。。

struct cmp {
    bool operator()(ListNode *a, ListNode *b) { return a->val >= b->val;}
};

    ListNode* mergeKLists(vector<ListNode*>&  lists) {
      
        priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
        
        for(int i = 0;i < lists.size();i++){
            if(lists[i] != NULL)
                pq.push(lists[i]);
        }
        
        ListNode *dummy = new ListNode(0);
        ListNode *tail = dummy;
        
        while(!pq.empty()){
            ListNode *tmp = pq.top();
            tail->next=tmp;
            tail = tmp;
            
            pq.pop();
            if(tmp->next != NULL)
                pq.push(tmp->next);
        }
        
        tail->next = NULL;
        return dummy->next;
        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值