leetcode:Merge k Sorted Lists
来源:互联网 发布:开心手机数据恢复大师 编辑:程序博客网 时间:2024/06/07 05:28
Merge k Sorted Lists
Total Accepted: 19819 Total Submissions: 92236Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
所以很快的, 只要对listNode 进行 K - 1次的归并排序即可,然后他给了我一个无情的tle
tle代码如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode mergeKLists(List<ListNode> lists) { ListNode ans = null; for(ListNode t : lists){ ans = merge2Lists(ans, t); } return ans; } public ListNode merge2Lists(ListNode h1, ListNode h2){ ListNode head = null; if(h1 != null && h2 != null){ head = new ListNode(-1); ListNode pre = head; while(h1 != null && h2 != null){ if(h1.val < h2.val){ pre.next = h1; pre = h1; h1 = h1.next; } else{ pre.next = h2; pre = h2; h2 = h2.next; } } pre.next = (h1 == null ? h2 : h1); head = head.next; }else { head = (h1 == null ? h2 : h1); } return head; }}
认真想,一个一个的归并起来会使得第一个的有序链表变得越来越大,
假设 K路的个数为k1,k2,k3, ... kk
那么第一次归并就是 = k1 ,
第二次就是归并 k1 + k2
第k次就是 k1 + k2 ... + kk 然后第一次到第k次的和就是归并的总次数了 可以计算得到为
k * k1 + (k - 1) * k2 + (k - 2) * k3 ......+ kk
又假设平均长度为len , 那么 k * k1 + (k - 1) * k2 + (k - 2) * k3 ......+ kk = len * k * (k + 1) / 2
显然,我们是可以通过分治的思想进行减低时间复杂度的,
假设k 为2的幂次, function (k) 代表合并 k个链表花费的时间
那么就会有如下公式计算:
k == 2 : 那么就是直接两个ListNode的长度之和
k > 2 : 2 * function(k / 2)
function(k) = 2 * function (k / 2), 递归计算
所以时间复杂度就变成了 len * k * lg(k), 代码如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode mergeKLists(List<ListNode> lists) { ListNode ans = dividerAndComquer(lists, 0, lists.size()); return ans; } public static ListNode dividerAndComquer(List<ListNode> lists, int start, int end){ if(end - start <= 2){ ListNode ans = null; while(start < end){ ans = merge2Lists(ans, lists.get(start)); ++start; } return ans; } else{ ListNode h1 = dividerAndComquer(lists, start, (start + end) / 2); ListNode h2 = dividerAndComquer(lists, (start + end) / 2, end); h1 = merge2Lists(h1, h2); return h1; } } public static ListNode merge2Lists(ListNode h1, ListNode h2){ ListNode head = null; if(h1 != null && h2 != null){ head = new ListNode(-1); ListNode pre = head; while(h1 != null && h2 != null){ if(h1.val < h2.val){ pre.next = h1; pre = h1; h1 = h1.next; } else{ pre.next = h2; pre = h2; h2 = h2.next; } } pre.next = (h1 == null ? h2 : h1); head = head.next; }else { head = (h1 == null ? h2 : h1); } return head; }}
0 0
- 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
- [LeetCode] Merge K sorted lists
- [LeetCode] Merge k Sorted Lists
- 【Leetcode】Merge k Sorted Lists
- 很特别的一个动态规划入门教程
- 数据库—耿建玲视频总结(三)
- Python深入学习之内存管理
- 几个简单的gdb调试命令
- oracle知识点_闪回(flashback)
- leetcode:Merge k Sorted Lists
- 现阶段大略总结的《数据结构》发散图——尚不完善
- 随机数与排列组合:生成1亿个随机的不同16位数
- Linux虚拟文件系统(概述)
- day41,page60
- UVa 11045 - My T-shirt suits me(最大流)
- 生活中的多线程之Thread.join()
- 爹地,我找到了!15个极好的Linux find命令示例
- 妈咪,我找到了!15个实用的Linux find命令示例