[leetcode]Merge k Sorted Lists
2015-08-17 19:26
351 查看
解题思路1:
1,用最小堆,size为lists的长度,Comparator定义为listNode.val
2,初始化把k个list的非空head都放进堆里
3,创建dummyhead用来引导这一切
空间复杂度 O( k )
假设有 k个链表,每个链表有n个元素,最小堆调整需要logk,要遍历所有nk个元素。
所以时间复杂度为 O ( nk log(k) )
解题思路2:
1,分治,我们知道合并两个 sorted linked list的方法,那么把k个两两合并,分而治之,也比暴力法好很多。
2,再加上对数组的smart的操作。
空间复杂度为 O( 1 )
时间复杂度 合并为logK,再加上遍历了所有的node,最后也是 O(nk log(k) )
1,用最小堆,size为lists的长度,Comparator定义为listNode.val
2,初始化把k个list的非空head都放进堆里
3,创建dummyhead用来引导这一切
空间复杂度 O( k )
假设有 k个链表,每个链表有n个元素,最小堆调整需要logk,要遍历所有nk个元素。
所以时间复杂度为 O ( nk log(k) )
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { private static final Comparator<ListNode> listComparator = new Comparator<ListNode>(){ @Override public int compare(ListNode x, ListNode y){ return x.val - y.val; } }; public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) return null; // 如果lists.length 为0,初始化PriorityQueue会报错,所以要先来了边界检测 Queue<ListNode> queue = new PriorityQueue<>(lists.length, listComparator); for (int i = 0; i < lists.length; ++i){ if(lists[i] != null) queue.add(lists[i]); } ListNode dummyHead = new ListNode(0); ListNode p = dummyHead; while(!queue.isEmpty()){ p.next = queue.poll(); p = p.next; if (p.next != null) queue.add(p.next); } return dummyHead.next; } }
解题思路2:
1,分治,我们知道合并两个 sorted linked list的方法,那么把k个两两合并,分而治之,也比暴力法好很多。
2,再加上对数组的smart的操作。
空间复杂度为 O( 1 )
时间复杂度 合并为logK,再加上遍历了所有的node,最后也是 O(nk log(k) )
public class Solution { public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) return null; int end = lists.length-1; int begin = 0; while( end != 0){ begin = 0; while ( begin < end ){ lists[begin] = merge2Lists(lists[begin], lists[end]); begin ++; end --; } } return lists[0]; } private ListNode merge2Lists(ListNode l1, ListNode l2){ ListNode dummy = new ListNode(0); ListNode p = dummy; while(l1 != null && l2 != null){ if (l1.val < l2.val){ p.next = l1; l1 = l1.next; }else{ p.next = l2; l2 = l2.next; } p = p.next; } if (l1 != null) p.next = l1; if (l2 != null) p.next = l2; return dummy.next; } }
相关文章推荐