博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 合并K个排序链表
阅读量:4874 次
发布时间:2019-06-11

本文共 1510 字,大约阅读时间需要 5 分钟。

题目

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:
输入:
[
1->4->5,
1->3->4,
2->6]
输出: 1->1->2->3->4->4->5->6
(题目出处 )

题目分析

首先我们需要K的指针指向每个链表的最前端,每次选出一个最小的和次小的结点进行连接。那么本题的要点就是快速地从K的指针中选出一个最小的和次小的指针。直接扫描一遍肯定是浪费时间的。我们可以用最小堆来实现,把k个指针插入到堆中,我们一个每次以O(lgn)的时间选出一个最小的元素,选出两个指针后,把最小的指针的下一个节点插入到堆中,插入时间也是O(lgn)。如此进行下去当堆为空的时候我们的链表也就合并完了。

/*       C++代码*/struct ListNodeCompare {    bool operator()(ListNode* a, ListNode* b) {        if (a == NULL && b != NULL) {            return false;        }        if (a != NULL && b == NULL) {            return true;        }        return a->val > b->val;    }};ListNode* mergeKLists(vector
& lists) { if (lists.empty()) { return NULL; } //优先队列 priority_queue
, ListNodeCompare> queue; for (auto p : lists) { if (p != NULL) { queue.push(p); } } if (queue.empty()) { return NULL; } ListNode* p = NULL; ListNode* q = NULL; ListNode* head = NULL; head = queue.top(); queue.pop(); if (head->next != NULL) { queue.push(head->next); } p = head; while (!queue.empty()) { q = queue.top(); queue.pop(); if (q->next != NULL) { queue.push(q->next); } p->next = q; p = p->next; } return head;}

值得注意的是结构体“ListNodeCompare”作为一个参数传递给了优先队列,这个结构体重载了“()”运算符,我们称以这个结构体为模板构造的对象为函数对象,或者行为像函数的对象,使用时直接“函数对象(参数列表)”即可使用。作为优先队列的参数传递是因为优先队列中需要一个标准去判断大小。

时间复杂度O(nlgn) 空间复杂度O(k)

转载于:https://www.cnblogs.com/FDProcess/p/9833713.html

你可能感兴趣的文章
走近SpringBoot
查看>>
java timer 使用:
查看>>
Lazyr.js – 延迟加载图片(Lazy Loading)
查看>>
二叉树相关题目8/24
查看>>
我的Android进阶之旅------>Android安全退出应用程序的几种方式
查看>>
uva 11181 - Probability|Given(概率)
查看>>
thinkphp3.2.3分页
查看>>
python程序之profile分析
查看>>
写在读研初期
查看>>
开环增益对负反馈放大电路的影响
查看>>
MySQL-ERROR 2003
查看>>
SQL Server2012-SSIS的包管理和部署
查看>>
JavaScript内置对象
查看>>
如何把js的循环写成异步的
查看>>
ER图是啥?
查看>>
too many include files depth = 1024错误原因
查看>>
HTTP协议详解(三)
查看>>
Android零基础入门第84节:引入Fragment原来是这么回事
查看>>
解析SQL Server之任务调度
查看>>
参考资料地址
查看>>