Leetcode 23. Merge k Sorted Lists
来源:互联网 发布:社交网络弊端研究数据 编辑:程序博客网 时间:2024/05/21 18:04
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题目大意:将 k个排好序的链表合并成一个有序链表。
题目分析:这题考虑用堆排序,为什么要用堆呢?至于堆不了解的同学可以看这个学习http://blog.csdn.net/morewindows/article/details/6709644
题目合并的过程中,是一个不断的找最小值的过程,用构造最小堆时间复杂度是 O( N*long(N) ),之后取出堆顶链表的头结点head插入到要合并的表中,并且将head=head->next;这时堆顶链表头结点数值发生了改变,最小堆不一定合法,通过调整堆(时间复杂度为 O( long (n) )使其合法,能快速找到第二个最小值。如果链表空了则删除,直到剩余最后一个链表。
代码如下:(运行时间 36ms)
class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { predo(lists);//预处理去除NULL的表 if(lists.empty()) return NULL; MakeHeap(lists);//建堆 return HeapSort(lists);//变种堆排序 }private: void predo(vector<ListNode*>& lists){ vector<ListNode*>::iterator ite=lists.begin(); while(ite!=lists.end()){ if(*ite){ ite++; }else{ ite=lists.erase(ite);// if NULL delete } } } void MinHeapFixdown(vector<ListNode*>& lists,int i){//调整根是下标为i的结点的树,使其称为合法堆 int n=lists.size(); int j=2*i+1; ListNode* temp=lists[i]; while(j<n){ if(j+1<n&&lists[j]->val>lists[j+1]->val) j++; if(temp->val<lists[j]->val) break; lists[i]=lists[j]; i=j;j=2*i+1; } lists[i]=temp; } void MakeHeap(vector<ListNode*>& lists){//堆化数组 int n=lists.size(); for(int i=n/2-1;i>=0;i--){ MinHeapFixdown(lists,i); } } ListNode* HeapSort(vector<ListNode*>& lists){//排序算法 ListNode head(INT_MIN); ListNode* tail=&head; while(lists.size()>1){ tail->next=lists.front(); tail=tail->next; lists.front()=lists.front()->next; if(!lists.front()){//链表中没有元素了就从二叉堆中删除 lists.front()=lists.back(); lists.pop_back(); } MinHeapFixdown(lists,0);//调整 } if(1==lists.size()) tail->next=lists.front(); return head.next; }};
0 0
- leetcode 23. LeetCode Merge k Sorted Lists
- [LeetCode]23.Merge k Sorted Lists
- LeetCode --- 23. Merge k Sorted Lists
- LeetCode 23.Merge k Sorted Lists
- [Leetcode] 23. Merge k Sorted Lists
- 【LeetCode】23.Merge k Sorted Lists
- [leetcode] 23.Merge k Sorted Lists
- Leetcode-23.Merge k Sorted Lists
- [Leetcode]23. Merge k Sorted Lists @python
- leetcode 23. Merge k Sorted Lists
- leetcode 23. Merge k Sorted Lists
- leetcode 23. Merge k Sorted Lists
- LeetCode 23. Merge k Sorted Lists
- [leetcode] 23. Merge k Sorted Lists
- LeetCode 23. Merge k Sorted Lists
- LeetCode 23. Merge k Sorted Lists
- LeetCode-23.Merge k Sorted Lists
- Leetcode 23. Merge k Sorted Lists
- 子list中的顺序会影响list的顺序问题(二)
- Spring MVC默认欢迎页面的配置方法
- IOS开发应用内跳转app store去下载、评分
- 编程小练习
- hdu 2680 Choose the best route(最短路)
- Leetcode 23. Merge k Sorted Lists
- IDA 调试 Android 方法及简单的脱壳实现
- IT界 PHP实现 HTML5数据推送SSE原理
- 140 - Bandwidth
- java高级教程
- Swift ABI 稳定时间将被推迟,新版本 iPhone 可能包括双镜头相机
- (高效开发)Android手机间使用socket进行文件互传实例
- SVG——坐标系统的变换整合
- iOS多线程GCD