Merge k Sorted Lists
也很简单,关键是掌握mergeSort
见ref http://www.cnblogs.com/springfor/p/3869217.html, 摘抄
这里来复习一下Merge Sort(对于数组操作),参考Wikipedia:
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
归并操作的过程如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
最差時間複雜度 | |
---|---|
最優時間複雜度 | |
平均時間複雜度 | |
最差空間複雜度 |
public class Solution { public ListNode mergeKLists(ArrayList<ListNode> lists) { if(lists==null || lists.size() <1) return null; return MergeSort(0, lists.size() -1, lists); } public ListNode MergeSort(int start, int end, ArrayList<ListNode> lists){ if(start<end){ int mid = start +(end-start)/2; ListNode left = MergeSort(start, mid, lists); ListNode right = MergeSort(mid+1, end, lists); return merge2lists(left, right); } return lists.get(start); } public ListNode merge2lists(ListNode l1, ListNode l2){ ListNode h = new ListNode(-1); ListNode l3 = h; 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 && l2!=null) l3.next = l2; if(l2==null && l1!=null) l3.next = l1; return h.next; } }