Merge K Sorted Lists -- LeetCode
2016-01-27 08:47
399 查看
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:构建一个大小为K的小顶堆。每次从堆顶取走一个元素后,都将这个元素所属的链表中下一个元素加入堆中。若没有下一个元素则不添加。该过程一直持续到堆空位置。时间复杂度O(nlogk)。
用优先队列实现:
用优先队列实现的声明如下:
priority_queue<元素类型, 该类型的容器(如vector<元素类型>), 比较类(自己定义)> 名称;
比如这个题中,我的声明语句为priority_queue<ListNode *, vector<ListNode *>, comp> q;
这里,ListNode指针类型的星号要与前面的类型名称用空格隔开,否则会报错。
比较类定义见具体代码。
思路:构建一个大小为K的小顶堆。每次从堆顶取走一个元素后,都将这个元素所属的链表中下一个元素加入堆中。若没有下一个元素则不添加。该过程一直持续到堆空位置。时间复杂度O(nlogk)。
用优先队列实现:
用优先队列实现的声明如下:
priority_queue<元素类型, 该类型的容器(如vector<元素类型>), 比较类(自己定义)> 名称;
比如这个题中,我的声明语句为priority_queue<ListNode *, vector<ListNode *>, comp> q;
这里,ListNode指针类型的星号要与前面的类型名称用空格隔开,否则会报错。
比较类定义见具体代码。
struct comp { bool operator()(ListNode* n1, ListNode* n2) { return n1->val > n2->val; } }; class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { priority_queue<ListNode *, vector<ListNode *>, comp> q; for (auto i : lists) if (i) q.push(i); if (q.empty()) return NULL; ListNode* res = q.top(); ListNode* pre = res; q.pop(); if (pre->next) q.push(pre->next); while (!q.empty()) { pre->next = q.top(); q.pop(); pre = pre->next; if (pre->next) q.push(pre->next); } return res; } };
相关文章推荐
- centos7 开机 自动连网
- 超全!整理常用的iOS第三方资源
- 跟我一起从零开始学WCF系列课程
- 在jmeter测试mysql中如何一次运行多条sql语句
- 在jmeter测试mysql中如何一次运行多条sql语句
- ubuntu server安装桌面
- 在 QT 中使用 libusb 检测 MAC 上的 USB 设备
- c#之加加减减的优先级
- IOS简单实现瀑布流UICollectionView
- CS模式下的自动填充框(高效率,解决输入法多次回发问题并进行延迟处理)
- Java简单介绍
- 网络超时的写法
- Greenplum数据库整体架构
- 如何配置apache服务器
- Linux曲径通幽:进程管理、计划任务
- hdu4507
- sql语句创建唯一索引
- CSS 布局实例系列(三)如何实现一个左右宽度固定,中间自适应的三列布局——也聊聊双飞翼
- java的垃圾回收机制
- poj-3254 Corn Fields 状态压缩dp