LeetCode23 Merge k Sorted Lists 把K个有序链表连接成一个
2015-05-06 11:17
239 查看
题目:
Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.
翻译:
把K个有序的链表合成一个,返回。
思路:
这道题和昨天的Merge 2 Lists有些类似。但是k不确定,如果用每个都去遍历的话,肯定是不会通过的。
So、可以想到的是归并方法。
还记得大一刚开始组长布置的归并作业,那时候刚入门,看的云里雾里。
正好借此机会把归并好好的复习一下。
先说一下这道题的解法:
因为是链表List,可以通过分治,把他分解成2个一组,然后对每组的2个进行Merge 2Lists。
接着在4个一组,因为上一步已经形成了2个链,所以此时也可通过Merge 2Lists进行,递归即可得到结果。
代码:
好了,这道题的代码就是上面。
这里,还是要把归并写一写。因为毕竟以后要用到。
归并排序wiki解释
个人的理解就是把一个长的分解成小部分,即分治,分成2个一组,把每组排序后,在进行4个一组,排序。
最后得到整体的有序排列。
百度一张图片 ,估计对理解有帮助
Wiki的解释:
归并排序具体工作原理如下(假设序列共有n个元素):
将序列每相邻两个数字进行归并操作,形成
个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成
个序列,每个序列包含四个元素
重复步骤2,直到所有元素排序完毕
于是乎,自己写一个归并排序吧。
输出中可以清楚的看出分组后排序的效果。
话说提交后看到一群人用C写才十几毫秒就通过了。果然屌!
等会研究研究他们的写法。然后在修改。
Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.
翻译:
把K个有序的链表合成一个,返回。
思路:
这道题和昨天的Merge 2 Lists有些类似。但是k不确定,如果用每个都去遍历的话,肯定是不会通过的。
So、可以想到的是归并方法。
还记得大一刚开始组长布置的归并作业,那时候刚入门,看的云里雾里。
正好借此机会把归并好好的复习一下。
先说一下这道题的解法:
因为是链表List,可以通过分治,把他分解成2个一组,然后对每组的2个进行Merge 2Lists。
接着在4个一组,因为上一步已经形成了2个链,所以此时也可通过Merge 2Lists进行,递归即可得到结果。
代码:
public ListNode mergeKLists(ListNode[] lists) { if(lists == null || lists.length == 0) return null; return MergeSort(lists, 0, lists.length-1); } public static ListNode MergeSort(ListNode[] lists,int l ,int r) { if(l>=r) return lists[l]; int m = (l+r)/2; ListNode ll = MergeSort(lists, l, m); ListNode rr = MergeSort(lists, m+1, r); return Merge(ll,rr); } public static ListNode Merge(ListNode l1,ListNode l2) { ListNode root =new ListNode(0); ListNode pre = root; pre.next = l1; while(true) { if(l1 == null) { pre.next = l2; break; } if(l2 == null) { pre.next = l1; break; } if(l1.val < l2.val) { pre.next = l1; l1 = l1.next; } else { pre.next = l2; l2 = l2.next; } pre = pre.next; } return root.next; }
好了,这道题的代码就是上面。
这里,还是要把归并写一写。因为毕竟以后要用到。
归并排序wiki解释
个人的理解就是把一个长的分解成小部分,即分治,分成2个一组,把每组排序后,在进行4个一组,排序。
最后得到整体的有序排列。
百度一张图片 ,估计对理解有帮助
Wiki的解释:
归并排序具体工作原理如下(假设序列共有n个元素):
将序列每相邻两个数字进行归并操作,形成
个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成
个序列,每个序列包含四个元素
重复步骤2,直到所有元素排序完毕
于是乎,自己写一个归并排序吧。
public class MergeSort { <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>static int number=0; <span style="white-space:pre"> </span>public static void MergeSort(int arr[],int l , int r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>if(l >= r) <span style="white-space:pre"> </span>return ; <span style="white-space:pre"> </span>int mid = (l+r)/2; <span style="white-space:pre"> </span>MergeSort(arr, l, mid);//分成组 <span style="white-space:pre"> </span>MergeSort(arr, mid+1, r); <span style="white-space:pre"> </span>Merge(arr, l, mid, r);//组内排序 <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public static void Merge(int arr[],int l,int mid, int r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>int []tep = new int[arr.length]; <span style="white-space:pre"> </span>int mm = mid+1; <span style="white-space:pre"> </span>int count = l,ll = l; <span style="white-space:pre"> </span>while(l <= mid && mm <= r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>if(arr[l] <= arr[mm]) <span style="white-space:pre"> </span>tep[count++] = arr[l++]; <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>tep[count++] = arr[mm++]; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while(l<= mid) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>tep[count++] = arr[l++]; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while(mm <=r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>tep[count++] = arr[mm++]; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> System.out.println("第"+(++number)+"趟\t"); <span style="white-space:pre"> </span>while(ll<=r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> arr[ll] = tep[ll]; <span style="white-space:pre"> </span> System.out.print(arr[ll] + "\t"); <span style="white-space:pre"> </span> ll++; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> System.out.println(); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * @param args <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>public static void main(String[] args) { <span style="white-space:pre"> </span>// TODO 自动生成的方法存根 <span style="white-space:pre"> </span>int[] a = {9,20,32,12,53,23,54,2}; <span style="white-space:pre"> </span> MergeSort(a, 0, a.length-1); <span style="white-space:pre"> </span>for(int t:a) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>System.out.println(t); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} }输出结果:
输出中可以清楚的看出分组后排序的效果。
话说提交后看到一群人用C写才十几毫秒就通过了。果然屌!
等会研究研究他们的写法。然后在修改。
相关文章推荐
- [LeetCode]Merge Two Sorted Lists & Remove Duplicates from Sorted List 两个有序链表合并为一个&删除链表重复元素
- LeetCode 21 Merge Two Sorted Lists 把两个链表有序连接
- Merge Two Sorted Lists(合并两个有序链表)
- 【leetcode】Merge k Sorted Lists(按大小顺序连接k个链表)
- LeetCode--Merge Two Sorted Lists(合并两个有序链表)Python
- leetcode_[python/C++]_21. Merge Two Sorted Lists(合并有序链表)
- LeetCode 21 Merge Two Sorted Lists (有序两个链表整合)
- Leet Code 23 Merge k Sorted Lists - 合并K个有序链表 Java
- leetcode:Merge Two Sorted Lists (链接两个有序链表)【面试算法题】
- [LeetCode21]Merge Two Sorted Lists(合并两个有序链表)
- 005-023-Merge k sorted lists 归并K个有序的链表
- [LeetCode23]Merge k Sorted Lists(合并k个有序链表)
- LeetCode 23 Merge k Sorted Lists(合并k个有序链表)
- leetcode 题解Merge Two Sorted Lists(有序链表归并)
- LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
- Merge Two Sorted Lists, 合并两个有序链表
- Leetcode刷题记——21. Merge Two Sorted Lists(合并两有序链表)
- [LeetCode-21] Merge Two Sorted Lists(合并两个有序链表)
- Leetcode #21 Merge Two Sorted Lists 合并有序链表 解题报告