您的位置:首页 > 其它

[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) )
/**
* 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: