Merge k Sorted Lists leetcode java
来源:互联网 发布:mac php集成环境工具 编辑:程序博客网 时间:2024/05/17 10:39
题目:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题解:
Merge k sorted linked list就是merge 2 sorted linked list的变形题。
而且我们很自然的就想到了经典的Merge Sort,只不过那个是对数组进行sort。而不同的地方,仅仅是Merge两个list的操作不同。
这里来复习一下Merge Sort(对于数组操作),参考Wikipedia:
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
归并操作的过程如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
Merge Sort 对数组操作的Java代码为:
public int[] mergeSort(int[] arr){ if(arr.length<2||arr == null) return arr; MSort(arr,0,arr.length-1);}public int[] MSort(int[] arr, int low, int high){ if(low < high){ int mid = (low+high)/2; int[] left = MSort(arr,low,mid); int[] right = MSort(arr,mid+1,high); return mergeTwoList(left,right); } }public int[] mergeTwoList(int[] A, int[] B) { int[] C = new int[A.length + B.length]; int k = 0; int i = 0; int j = 0; while(i < A.length && j < B.length) { if (A[i] < B[j]) C[k++] = A[i++]; else C[k++] = B[j++]; } while (i < A.length) C[k++] = A[i++]; while (j < B.length) C[k++] = B[j++]; return C;}
下面就是这道题的解法,跟上面的方法一样一样的,就是在mergeTwoList时候是对linkedlist做,套用Merge 2 sorted list解法即可,代码如下:
public ListNode mergeKLists(ArrayList<ListNode> lists) { if(lists==null || lists.size()==0) return null; return MSort(lists,0,lists.size()-1); } public ListNode MSort(ArrayList<ListNode> lists, int low, int high){ if(low < high){ int mid = (low+high)/2; ListNode leftlist = MSort(lists,low,mid); ListNode rightlist = MSort(lists,mid+1,high); return mergeTwoLists(leftlist,rightlist); } return lists.get(low); } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null) return l2; if(l2==null) return l1; ListNode l3; if(l1.val<l2.val){ l3 = l1; l1 = l1.next; }else{ l3 = l2; l2 = l2.next; } ListNode fakehead = new ListNode(-1); fakehead.next = l3; while(l1!=null&&l2!=null){ if(l1.val<l2.val){ l3.next = l1; l3 = l3.next; l1 = l1.next; }else{ l3.next = l2; l3 = l3.next; l2 = l2.next; } } if(l1!=null) l3.next = l1; if(l2!=null) l3.next = l2; return fakehead.next; }
更多Mergesort的讲法请参考:http://www.cs.princeton.edu/courses/archive/spr07/cos226/lectures/04MergeQuick.pdf
讲的挺好的
阅读全文
0 0
- [Leetcode] Merge k Sorted Lists (Java)
- [LeetCode][Java] Merge k Sorted Lists
- leetcode:Merge k Sorted Lists 【Java】
- LeetCode : Merge k Sorted Lists [java]
- (Java)LeetCode-23. Merge k Sorted Lists
- Merge k Sorted Lists Leetcode Java
- 【LeetCode】Merge k Sorted Lists(java)
- [LeetCode] 23. Merge k Sorted Lists java
- leetcode Merge k Sorted Lists(Java)
- Merge k Sorted Lists leetcode java
- 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
- Java线程模型
- Android之Drawerlayout——实现侧滑菜单
- Python笔记目录
- 网络编程
- 3-html-css
- Merge k Sorted Lists leetcode java
- 实现KNN中的排序sorted
- HDU-4764-Stone 【巴什博弈】
- 精确率(precision)和召回率(recall)区别
- 2017年8月15日提高组T2 购买
- 避免创建不必要的对象。
- 条件变量
- SSL2705 2017年8月17日提高组T1 游戏(math+二分)
- LintCode632