leetcode系列(40)Merge K Sorted Lists
来源:互联网 发布:观看网络直播人群分析 编辑:程序博客网 时间:2024/04/28 21:17
Merge k sorted linkedlists and return it as one sorted list. Analyze and describe its complexity.
解答:这个题目有两种做法,一个是两两mergeTwoSortedLists,最后返回第一个list;另一种是用堆,但是需要使用priority_queue,并且实现ListNode*的compare的functor。对于第一种做法为什么是两两merge而不是用第一个list去其它的list轮流merge呢?题目中让分析复杂度,两两merge的复杂度是O(2n*(k/2) + 4n*(k/4)... + 2^M*n*(k/2^M)) = O(nk*logk),依次merge的复杂度是:O(2n + 3n + ... + kn) = O(n*k^2)。使用堆的方法是维护了一个k个阶段的最小堆,所以复杂度显而易见就是O(n*k*logk)。第一种方法的代码如下:
class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { int len = lists.size(); if (len <= 0) { return nullptr; } while (len > 1) { // be aware the difference between (len + 1) / 2 and len / 2 int cur_len = (len + 1) / 2; for (int i = 0; i < len / 2; i++) { lists[i] = mergeTwoLists(lists[i], lists[i + cur_len]); } len = cur_len; } return lists[0]; }private: ListNode* mergeTwoLists(ListNode* head1, ListNode* head2) { ListNode* head = nullptr; if (head1 == nullptr) { head = head2; } else if (head2 == nullptr) { head = head1; } else { if (head1->val < head2->val) { head = head1; head->next = mergeTwoLists(head1->next, head2); } else { head = head2; head->next = mergeTwoLists(head1, head2->next); } } return head; }};
第二种方法的代码如下:
class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.empty()) { return nullptr; } ListNode dummy = ListNode(0); ListNode* ptr = &dummy; std::priority_queue<ListNode*, std::deque<ListNode*>, cmp> heap; for (auto item : lists) { if (item != nullptr) { heap.push(item); } } while (heap.empty() == false) { ListNode* cur = heap.top(); heap.pop(); ptr->next = cur; ptr = cur; if (cur->next != nullptr) { heap.push(cur->next); } } return dummy.next; }private: struct cmp { bool operator() (ListNode* p1, ListNode* p2) { return p1->val > p2->val; // like std::greater<int> } };};
0 0
- leetcode系列(40)Merge K Sorted Lists
- 【Leetcode长征系列】Merge k Sorted Lists
- LeetCode(23)Merge k Sorted Lists
- LeetCode: Merge k Sorted Lists
- LeetCode Merge k Sorted Lists
- LeetCode: Merge k Sorted Lists
- [Leetcode] Merge k Sorted Lists
- [Leetcode] Merge k Sorted Lists
- [Leetcode] Merge K sorted lists
- [LeetCode]Merge k Sorted Lists
- [LeetCode] Merge k Sorted Lists
- LeetCode-Merge k Sorted Lists
- LeetCode: Merge k Sorted Lists
- LeetCode - Merge k Sorted Lists
- LeetCode | Merge k Sorted Lists
- 【leetcode】Merge k Sorted Lists
- Leetcode: Merge k Sorted Lists
- <Leetcode>Merge k Sorted Lists
- C# 之 获取当前路径
- String构造函数 拷贝构造函数 析构函数 赋值构造函数的实现
- R语言-数组到矩阵的转换
- 软件测试需要学习些什么技能
- 对观察结果的解释---一般系统论读书笔记
- leetcode系列(40)Merge K Sorted Lists
- OC内存管理初级
- birt中根据两个表的差别生成一个饼图
- HDU2098
- 关于Unkown entity的解决方法
- @property中的 strong retain copy weak 和assign
- Otsu算法 灰度图像二值化
- iOS中 CGGeometry 类方法总结
- Objective-C的基本类方法,举例