leetcode题目 合并N个排序好的链表
2015-10-03 23:03
211 查看
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路: 两种方法,第一种思路调用合并两个排序好链表的函数,时间效率O(kN),k是链表个数,N是所有链表节点总数。第二种思路采用一个最小堆,先将k的链表的头结点构造成一个最小堆,取出最小的元素,并将最小元素所在链表的下一个元素压入堆中。直至堆为空。时间效率O(Nlogk)。本文两种代码均实现了。
解法一: 容易理解,但是时间效率差。虽然在本地对数据量小的测试用例都通过了。但leetcode上本题的难度系数是困难,所以这种方法不会通过,结果是时间超限,
解法二: 利用堆,时间效率好,代码如下
运行结果通过,并且击败了99.29%的代码有木有!!!
思路: 两种方法,第一种思路调用合并两个排序好链表的函数,时间效率O(kN),k是链表个数,N是所有链表节点总数。第二种思路采用一个最小堆,先将k的链表的头结点构造成一个最小堆,取出最小的元素,并将最小元素所在链表的下一个元素压入堆中。直至堆为空。时间效率O(Nlogk)。本文两种代码均实现了。
解法一: 容易理解,但是时间效率差。虽然在本地对数据量小的测试用例都通过了。但leetcode上本题的难度系数是困难,所以这种方法不会通过,结果是时间超限,
class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { if(!lists.size()) return NULL; ListNode* phead=NULL; for(auto i=lists.begin();i!=lists.end();++i) { phead=mergeTwoLists(phead,*i); } return phead; } ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1==NULL) return l2; if(l2==NULL) return l1; ListNode* pmerge=NULL; if(l1->val<l2->val) { pmerge=l1; pmerge->next=mergeTwoLists(l1->next,l2); } else { pmerge=l2; pmerge->next=mergeTwoLists(l1,l2->next); } return pmerge; } };
解法二: 利用堆,时间效率好,代码如下
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { vector<ListNode*> heap; for(auto i=lists.begin();i!=lists.end();++i) { if(*i!=NULL) heap.push_back(*i); } //若堆为空,表示所有链表都为空或者lists本身为空 if(!heap.size()) return NULL; ListNode* head,*p; make_heap(heap.begin(),heap.end(),greater); pop_heap(heap.begin(),heap.end(),greater); head=p=heap.back(); heap.pop_back(); //堆非空,取出最小结点,然后压入最小结点的下一个结点 while(heap.size()) { if(p->next!=NULL) { heap.push_back(p->next); push_heap(heap.begin(),heap.end(),greater); } pop_heap(heap.begin(),heap.end(),greater); p->next=heap.back(); heap.pop_back(); p=p->next; } return head; } //本程序堆中存放的是指针,并且要实现最小堆,所以写一个简单的比较函数 static bool greater(ListNode* l1,ListNode* l2) { if(l1->val>l2->val) return true; else return false; } };
运行结果通过,并且击败了99.29%的代码有木有!!!
相关文章推荐
- POJ 2082 The Fewest Coins
- 责任链模式----ChainOfResponsibility
- UIScrollView和UIPageControl组合照片浏览滑动效果
- lua.c:80:31: fatal error: readline/readline.h: No such file or directory
- 利用quietHDD解决硬盘C1增长以及异响问题
- Spring AOP例子
- matab plot指令和低通滤波器的响应图
- IOS开发-属性动画和关键帧动画的使用
- 自动化运维工具puppet(二)
- LeetCode OJ :Unique Binary Search Trees II(唯一二叉搜索树)
- 关于为什么电脑32位系统在处理数据时是4个字节的二进制数据以及byte取值范围的考虑?
- c#多维数组
- SQL SERVER 2008中输入汉字乱码的问题
- java中包装类及装箱拆箱
- 真迹调试小错误
- Game Programming Patterns-再探Flyweight模式
- python + opencv 学习系列 0 :python + opencv 配置
- Add Two Numbers
- 剑指offer—复杂链表的复制
- 安卓控件使用系列33:ViewPager多页面滑动控件的使用方法2