Merge K Sorted List
来源:互联网 发布:阿里云 usb调试 编辑:程序博客网 时间:2024/05/29 03:36
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
11/3 这道题也跟狗家的onsite有点像, 下面讲讲俺的思路:
之前的解法:
把这些lists两两merge, 知道最后只剩下一个list
public class Solution { public ListNode mergeKLists(List<ListNode> lists) { /*CAUTION: use a loop to remove throws an error http://stackoverflow.com/questions/8189466/java-util-concurrentmodificationexception */ //if(lists.size() > 300) return null; List<ListNode> remove = new ArrayList<ListNode>(); for(int i= lists.size()-1; i>=0; i--){ if(lists.get(i) == null){ lists.remove(i); } } ListNode tail = null, list = null; while( !lists.isEmpty() ){ ListNode p = lists.get(0); ArrayList<Integer> rm = new ArrayList<Integer>(); for(int i=0; i<lists.size(); i++){ ListNode node = lists.get(i); if(node.val < p.val){ p = node; } } for(int i=lists.size()-1; i>=0; i--){ if(lists.get(i).val == p.val){ rm.add(Integer.valueOf(i)); } } for(int j=0; j<rm.size(); j++){ int index = rm.get(j).intValue(); ListNode q = lists.get(index); if(list == null){ list = q; }else{ tail.next = q; } tail = q; q = q.next; if(q == null){ lists.remove(index); }else{ lists.remove(index); lists.add(q); } } } return list; }}
空间复杂度是O(1),
时间复杂度:
首先假设list 2i 和 list 2i+1 合并成list i, 时间是O(m), m是最长的一个list的长度, 一共有n/2个要合并, 假设没有空的list
然后是list 2i和list 2i+2 合并成list 2i, 时间是O(2m), 一共是n/4个需要合并
。。。
可以知道对于某一个ListNode, 会被访问lg(n)次, n是list的数量, 所以时间复杂度是O(Nlgn), N是所有node的数量
另一种解法是使用一个heap储存这些lists,每次得到min的时候都需要siftdown,所以时间复杂度是O(Nlgn)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public class Heap{ public ListNode[] list; public int size = 0; public Heap(int n){ list = new ListNode[n]; } public boolean isEmpty(){ return size == 0; } public void heapify(){ for(int i=size-1; i>=0; i--){ siftDown(i); } } public ListNode min(){ ListNode head = list[0]; list[0] = list[0].next; if(list[0] == null){ swap(0,size-1); size--; siftDown(0); }else{ siftDown(0); } head.next = null; return head; } private void siftDown(int from){ int left = 2*from + 1; int right = left + 1; if(left >= size) return; int min = from; if(left < size && list[left].val < list[min].val) min = left; if(right < size && list[right].val < list[min].val) min = right; swap(min,from); if(min != from) siftDown(min); } private void swap(int i, int j){ ListNode tmp = list[i]; list[i] = list[j]; list[j] = tmp; } } public ListNode mergeKLists(List<ListNode> lists) { /** * try solve with a heap */ Heap heap = listToHeap(lists); if(heap.size == 0) return null; ListNode ans = heap.min(); ListNode prev = ans; while(!heap.isEmpty()){ prev.next = heap.min(); prev = prev.next; } return ans; } public Heap listToHeap(List<ListNode> lists){ int len = lists.size(); Heap heap = new Heap(len); int start = 0, end = len-1; for(ListNode list: lists){ if(list != null){ heap.list[start++] = list; }else{ heap.list[end--] = null; } } heap.size = start; heap.heapify(); return heap; } }
0 0
- Merge K Sorted List
- Merge K Sorted List
- Merge k sorted List
- Merge k sorted list--LeetCode
- Leetcode - Merge K sorted list
- LeetCode 23: Merge K Sorted List
- LeetCode[Linked List]: Merge k Sorted Lists
- 【Leetcode】Merge K Sorted Linked List
- merge k sorted list with iterator
- FTPrep, 23 Merge k sorted list
- 多路归并排序 merge k sorted array, merge k sorted linked list
- [LeetCode] Merge k Sorted List (priority queue, min heap, comparator)
- Java菜鸟入门(21) Merge K sorted List
- leetcode23~Merge k Sorted Lists Add to List
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K Sorted Lists
- Checkout remote Git branch
- "面试共三面。 校招笔..."
- Leetcode: Letter Combinations of a Phone Number
- Unique Paths
- 在AJAX返回结果中循环执行另一个AJAX
- Merge K Sorted List
- Unique Paths II
- Facebook Open Graph META Tags
- What does appending “?v=1” to CSS and Javascript URLs in link and script tags do?
- VirtualBox如何配置Bridge和Host-Only虚拟网卡
- Optimize Facebook Sharing
- Creating “Share This on Facebook/Twitter” Links
- 随笔20141103
- How To Set Up Twitter Cards