【Leetcode】之Merge k Sorted Lists
2015-11-13 10:55
218 查看
一.问题描述
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.二.我的解题思路
之前是做过merge 2 sorted list的题目,所以拿到这个题目,很自然的想法就是采用分治递归法,将原问题转换成多个merfe 2的问题求解。但是结果超时了,这种分治再合并的算法的时间复杂度是O(2n+3n+…+kn)=O(nk²),接下来就是思考优化。遗憾的是,我自己的思维局限在了如何利用merge 2的结果,最大限度减少merge的耗时上,想了一会没有想到太好的思路。
上网查阅资料,发现别人是用排序问题的思路来解决这个问题。首先取k个链表的头元素,求取最小的元素,将其设为结果链表的头结点。然后维护一个最小堆结构,这种做法的复杂度是O(n*k*logk),测试通过的程序如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ #define LN ListNode* #define HEAP heap.begin(),heap.end() #define PB push_back #define INF 1000000 struct node { int val; LN from; node(ListNode* n) { if ( n==NULL ) { val=INF; } else { val=n->val; } from=n; } bool operator<(const node& other)const { return val<other.val; } bool operator>(const node& other)const { return val>other.val; } }; class Solution { public: ListNode *mergeKLists(vector<ListNode *> &lists) { // Start typing your C/C++ solution below // DO NOT write int main() function if (lists.empty()) return NULL; int n= lists.size(); vector<node> heap; heap.reserve(n); for( int i=0;i<n;i++) heap.PB(node(lists[i])); make_heap(HEAP,greater<node>()); LN head= new ListNode(0); LN pL = head; pop_heap(HEAP,greater<node>()); node small=heap.back(); heap.pop_back(); while(small.val!=INF) { LN next=small.from->next; pL->next=small.from; small.from->next=NULL; pL=pL->next; heap.PB(node(next)); push_heap(HEAP,greater<node>()); pop_heap(HEAP,greater<node>()); small=heap.back(); heap.pop_back(); } LN ret=head->next; delete head; return ret; } };
相关文章推荐
- ASP.NET WebService的图片验证码服务
- jquery ajax局部加载方法介绍
- java理论学时第七节。课后作业。
- HDU 3277 Marriage Match III 二分+网络流拆点
- linux串口操作及设置详解
- NSURLCache 在 iOS 8 的 UIWebView 中不执行bug
- iOS中关闭屏幕旋转功能时如何判断屏幕方向
- Java Web Service-CXF
- 设计模式 装饰者模式 带你重回传奇世界
- C#操作Word
- Windows 下创建目录,以及删除目录,可以运行的
- 第四章:Dubbo整合maven+spring+springmvc+mybatis之mybatis集成
- void pthread_exit(void *retval) http://blog.csdn.net/youbang321/article/details/7816016
- 物联网时代的35款开源工具
- Objective-C开发编码规范
- DIV水平居中显示CSS代码
- JQuery hover toggle事件使用
- POJ-1125& NYOJ-426- 多源最短路-spfa
- Java Web Service
- VS 2013下实现通过数据实体模型使用MySql