Leetcode 23
来源:互联网 发布:北京软件行业协会 编辑:程序博客网 时间:2024/05/21 06:45
题意
合并k个有序链表。
思路
k路归并。
算法1
维护一个大小为k的堆。
- 维护一个大小为k的小顶堆,开始的时候将这k个链表的头结点扔到堆里面去(如果为null,不扔进去,并且我们维护的堆的大小相应的减小)。
- 每次,从堆顶弹出一个节点t,加入我们的结果链表中。
- 如果t对应链表的后面的一个节点为空,do nothing;否则,将t后面的一个节点假如到堆里面。
- 重复过程3,4直到堆为空。
时间复杂度:
其中n为每条链表的节点数目(实际上每条链表的节点数目不一定相等,我们这里假设
算法2
分治,两两归并。
我们利用之间的mergeTwoSortedList
,将k个链表先将前面的k/2个链表归并成一个链表l1,后面的k/2个链表归并成另一个链表l2,然后再将l1和l2这两个有序链表合成新的有序链表。
时间复杂度:
假设链表的长度相等都为n,有k个链表。那么我们总的时间为:
其中
代码
algorithm 1
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; *///algorithm 1struct cmp { bool operator()(ListNode *x, ListNode *y) { return y->val < x->val; }};class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { priority_queue<ListNode*, vector<ListNode*>, cmp> q; int k = lists.size(), cnt = 0; for (int i = 0; i < k; i++) { if (lists[i]) q.push(lists[i]); } ListNode *head = new ListNode(0), *p = head; while (!q.empty()) { ListNode *t = q.top(); q.pop(); p->next = t; p = p->next; t = t->next; if (t) q.push(t); } return head->next; }};
algorithm 2
class Solution {public: ListNode* mergeTwoList(ListNode *l1, ListNode *l2) { ListNode *head = new ListNode(0), *p = head; while (l1 || l2) { ListNode *t; if (l1 && l2) t = l1->val < l2->val ? l1 : l2; else if (l1) t = l1; else t = l2; p->next = t; p = p->next; t == l1 ? l1 = l1->next : l2 = l2->next; } return head->next; } ListNode* merge(int l, int r, vector<ListNode*>& v) { if (l > r) return nullptr; if (l == r) return v[l]; if (r == l + 1) return mergeTwoList(v[l], v[r]); int m = l + (r - l >> 1); return mergeTwoList(merge(l, m, v), merge(m + 1, r, v)); } ListNode* mergeKLists(vector<ListNode*>& lists) { return merge(0, lists.size() - 1, lists); }};
0 0
- LeetCode | # 23
- Leetcode#23||
- Leetcode 23
- LeetCode #23
- [LeetCode] Sort Colors [23]
- [leetcode 23] Generate Parentheses
- [leetcode]23 Path Sum
- leetcode #23 in cpp
- leetCode练习(23)
- 23 leetcode - Generate Parentheses
- (java)leetcode-23
- Leetcode刷题(23)
- [Leetcode] 116, 129, 23
- leetcode-个人题解23
- 2017.10.23 LeetCode
- LeetCode刷题(23)
- leetcode
- [leetcode]
- [BZOJ2002][[Hnoi2010]Bounce 弹飞绵羊]
- listiview嵌套listview时带索引的定位,且隐藏不想显示的item
- 【Java集合的详细研究9】Java堆栈(stack)的使用方法
- Linux下安装第2个MySQL
- 智慧LED灯杆显示屏
- Leetcode 23
- Mutual Training for Wannafly Union #6 A(bfs)/B(规律)/E (并查集)
- 安装spring IDE插件 版本号一定要对上
- 表达式计算(C++实现)
- BaseActivity
- 年青人,渴望力量吗?
- 111
- MySQL-Rising Temperature
- 【活动时间调整】博客搬家,有礼相送