LeetCode Merge K Sorted Lists
来源:互联网 发布:网络语安利的意思 编辑:程序博客网 时间:2024/05/05 12:25
题目:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题意:
考虑将k个已经排好序的单链表合并成一个单链表。此题和Merge Two Sorted Lists(https://leetcode.com/problems/merge-two-sorted-lists/)有异曲同工之妙,就是说,都是要合并已经排好序的单链表。那么此题我们考虑在合并两个已经排好序的单链表的那题的基础上来重新修改代码。首先我们能够想到的一种方法是采用遍历一遍单链表数组,依次两两将相邻的两个单链表合并,但是这样的后果就是Time Limit Exceeded,超时。超时的代码如下:
public ListNode mergeKLists(ListNode[] lists){if(lists.length == 0 || lists == null)return null;else if(lists.length == 1)return lists[0];else {ListNode l = lists[0];for(int i = 1; i < lists.length; i++)l = mergeTwoLists(l,lists[i]);return l;}}public static ListNode mergeTwoLists(ListNode l1,ListNode l2) //两个已经排好序的单链表合并{ListNode node,list;ListNode head = null;if(l1 == null && l2 == null){return null;}else if(l1 == null && l2 != null)return l2;else if(l1 != null && l2 == null)return l1;else{if(l1.val <= l2.val){node = l1;head = node;l1 = l1.next;}else{node = l2;head = node;l2 = l2.next;}while(l1 != null && l2 != null){if(l1.val <= l2.val){node.next = l1;node = node.next;l1 = l1.next;}else{node.next = l2;node = node.next;l2 = l2.next;}}if(l1 == null && l2 != null){while(l2 != null){node.next = l2;node = node.next;l2 = l2.next;}}else if(l1 != null && l2 == null){while(l1 != null){node.next = l1;node = node.next;l1 = l1.next;}}return head;}}那么就不能这么简单地做,于是考虑用归并合并来做,用递归将整个单链表数组分成两部分,然后不停地分,不停地合并,注意在这个代码中,运用了List<ListNode>这个链表,主要是想要运用它的subList方法,可以很方便地截取List中的某一部分。最后将取到的最后两个List再来一次两两合并即可。
class ListNode{int val;ListNode next;ListNode(int x){val = x;}}public class mergeLists {public ListNode mergeKLists(ListNode[] lists){if(lists == null || lists.length == 0)return null;List<ListNode> list = new ArrayList<ListNode>();for(int i = 0; i < lists.length; i++)list.add(lists[i]);return mergeklists(list);}public ListNode mergeklists(List<ListNode> list){int length = list.size();if(list == null || length == 0)return null;else if(length == 1)return list.get(0);else{int mid = (length - 1) / 2;ListNode l1 = mergeklists(list.subList(0,mid + 1));ListNode l2 = mergeklists(list.subList(mid + 1,length));return mergeTwoLists(l1,l2);}}public static ListNode mergeTwoLists(ListNode l1,ListNode l2) //两个已经排好序的单链表合并{ListNode node,list;ListNode head = null;if(l1 == null && l2 == null){return null;}else if(l1 == null && l2 != null)return l2;else if(l1 != null && l2 == null)return l1;else{if(l1.val <= l2.val){node = l1;head = node;l1 = l1.next;}else{node = l2;head = node;l2 = l2.next;}while(l1 != null && l2 != null){if(l1.val <= l2.val){node.next = l1;node = node.next;l1 = l1.next;}else{node.next = l2;node = node.next;l2 = l2.next;}}if(l1 == null && l2 != null){while(l2 != null){node.next = l2;node = node.next;l2 = l2.next;}}else if(l1 != null && l2 == null){while(l1 != null){node.next = l1;node = node.next;l1 = l1.next;}}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
- OpenWrt 4G网卡拨号配置
- iOS学习——利用Timer更新通话时间与播放器进度条
- Hadoop伪分布式搭建-(1)
- RecyclerView match_parent 不起作用的解决方法
- 2016-1-19(移动触摸事件以及事件的一些属性引申)
- LeetCode Merge K Sorted Lists
- 解决Sublime Text 3中文显示乱码(tab中文方块)问题
- 关于java hashmap的心得
- 写给开发者:记录日志的10个建议
- Java内存模型FAQ(十)volatile是干什么用的
- Redis-3.0.6 集群部署集成SpringJava工程-----spring集成
- 优雅的App完全退出方案(没有任何内存泄漏隐患)
- 多线程初探(八)
- 常用的安卓UI相关的工具集合