leetcode题目 合并N个排序好的链表
来源:互联网 发布:mac图片怎么保存 编辑:程序博客网 时间:2024/06/14 06:51
题目: 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上本题的难度系数是困难,所以这种方法不会通过,结果是时间超限,
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%的代码有木有!!!
0 0
- leetcode题目 合并N个排序好的链表
- 题目:合并k个排序链表
- Leetcode练习<二十二> 合并排序好的链表
- 合并n个已排序的链表
- leetcode--23--合并n个已排序队列
- LeetCode第22题--合并两个排序好的链表
- 堆排序合并几个已经排序好的链表
- 合并俩个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表-九度
- 题目1519:合并两个排序的链表
- 九度 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- java线程池学习(四) —— Executors类
- IOS开发-属性动画和关键帧动画的使用
- sql server数据类型详解
- UIScrollView和UIPageControl组合照片浏览滑动效果
- Java核心技术第4章(2)
- leetcode题目 合并N个排序好的链表
- matlab中hold指令、figure指令及subplot指令的使用
- ubuntu15.04编译lua源码
- 已知二叉树的前序和中序序列,不建立二叉树来输出后序序列
- MySQL学习笔记(四)--常用函数
- Hive笔记七:Hive的数据导出
- session缓存时间的两种设置方式
- 海量数据挖掘MMDS week2: LSH的距离度量方法
- Head First设计模式—策略模式