LeetCode 23. 合并K个排序链表

7 篇文章 0 订阅
1 篇文章 0 订阅

题目链接 23. 合并K个排序链表

题目描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

解题思路

第一种方法
把所有的数值都丢入一个链表中,排序后返回值。复杂度O(nklog(kn))。
第二种方法
先把每个链表的头丢入堆中或者是优先队列,然后依次取出,并且把取出来的那个数的下一个数丢进去,这样复杂度是O(n
klog(kn))。
//之前觉得第二种更优一点,但是复杂度好像是一样的,可能是自己算错了吧。
这道题不难,主要是复习一下优先队列的定义和操作,然后熟悉一下链表与优先队列的结合。

程序代码

c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    struct cmp {
        bool operator () (ListNode* a , ListNode* b) {
            return a->val > b->val;
            //表示排序顺序为从小到大
            //只是不太明白为什么在那里是()圆括号,不应该是<或者>号?
        }
    };
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode* ,vector<ListNode*> , cmp> head;//优先队列定义,ListNode* 也是一种类型 
        for(register int i=0;i<lists.size();++i) {
            if(lists[i]!=NULL) {
                head.push(lists[i]);
            }
        }//把每个list的头结点扔进去
        ListNode* phead =new ListNode(-1);
        ListNode* pcur={phead};
        ListNode* top;
        while(!head.empty()) {
            top=head.top();head.pop();
            pcur->next=top;
            pcur=pcur->next;
            if( top->next != NULL ) head.push(top->next);
        }//复习了一下堆(优先队列)的操作
        pcur=phead->next;
        delete phead;
        return pcur;//返回指针
    }
};

参考博客

c++优先队列(priority_queue)用法详解
for(auto &a :b) 循环的另一种用法
[C++] auto 关键字
参考题解
参考一
参考二

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值