标签:描述 top length col line rri i++ == log
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
把K个已经排序的链表合并到一起并返回它的链表头,分析并描述它的复杂度。
这道题的难度是hard。这道题的解题思路有三种:
1、2合并,遍历2n个节点
1,2结果和3合并,遍历3n个节点
1,2,3结果和4合并,遍历4n个节点
1,2,3,..,k-1结果和k合并,遍历kn个节点
总共遍历的节点数目为n(2+3+…+k) = n*(k^2+k-2)/2, 因此时间复杂度是O(n*(k^2+k-2)/2) = O(nk^2)。
1、3合并,合并结果放到1的位置
2、4合并,合并结果放到2的位置
再把1、2合并(相当于原来的13 和 24合并)
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int n = lists.length;
if(n==0 || lists==null)
return null;
//if(n==1)
// return lists[0];
for(int i=1;i<n;i++) {
lists[0] = mergeTwoLists(lists[0],lists[i]);
}
n = k;
}
return lists[0];
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null)
return l2;
if(l2==null)
return l1;
ListNode head = null;
ListNode head_c = l1.val>l2.val?l2:l1;
head = head_c;
while(l1 !=null && l2!=null) {
if(l1.val>l2.val) {
head.next = l2;
l2 = l2.next;
}
else {
head.next = l1;
l1 = l1.next;
}
}
if(l1==null) {
head.next = l2;
}
else {
head.next = l1;
}
return head_c.next;
}
}
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int n = lists.length;
if(n==0 || lists==null)
return null;
//if(n==1)
// return lists[0];
while(n>1) {
int k = (n+1)/2;
for(int i=0;i<n/2;i++) {//注意这里i的取值范围,因为n存在奇偶两种情况
lists[i] = mergeTwoLists1(lists[i],lists[i+k]);
}
n = k;
}
return lists[0];
}
public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
if(l1==null)
return l2;
if(l2==null)
return l1;
if(l1.val<l2.val) {
l1.next = mergeTwoLists1(l1.next,l2);
return l1;
}else {
l2.next = mergeTwoLists1(l2.next,l1);
return l2;
}
}
}
public class Solution {
public ListNode mergeKLists(List<ListNode> lists) {
if (lists==null||lists.size()==0) return null;
PriorityQueue<ListNode> queue= new PriorityQueue<ListNode>(lists.size(),new Comparator<ListNode>(){
@Override
public int compare(ListNode o1,ListNode o2){
if (o1.val<o2.val)
return -1;
else if (o1.val==o2.val)
return 0;
else
return 1;
}
});//建堆并重写compare函数
ListNode dummy = new ListNode(0);
ListNode tail=dummy;
for (ListNode node:lists)
if (node!=null)
queue.add(node);
while (!queue.isEmpty()){
tail.next=queue.poll();//取出堆中的最小值
tail=tail.next;
//并把所在链表的下一个放入堆中
if (tail.next!=null)
queue.add(tail.next);
}
return dummy.next;
}
}
Leetcode23:Merge k Sorted Lists
标签:描述 top length col line rri i++ == log
原文地址:http://www.cnblogs.com/chailinbo/p/7586689.html