您的位置:首页 > 其它

LeetCode OJ算法题(二十二):Merge k Sorted Lists

2014-07-18 17:33 155 查看
题目:

Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.

解法:

对k个有序数组进行组合,第一反应就是归并排序。

所谓归并排序就是对一数组两两分组后排序,再把这n/2个有序数组两两组合,排序后得n/4个有序数组,以此类推,直到全部何为一个数组为止。

对于链表也一样,先两个两个的进行融合,逐层向上,因此可以使用递归,当Lists为空,或者Lists只有一个元素时,停止递归。

算法的主要工作是对两个有序表进行融合,可以各设一个指针,小的数加入新的表,指针++,直到循环到链表为空。
import java.util.ArrayList;
import java.util.List;

public class No22_MergeKSortedLists {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public static void main(String[] args){
ListNode a11 = new ListNode(1);
ListNode a12 = new ListNode(3);
ListNode a13 = new ListNode(5);
a11.next = a12;
a12.next = a13;
ListNode b11 = new ListNode(2);
ListNode b12 = new ListNode(4);
ListNode b13 = new ListNode(6);
b11.next = b12;
b12.next = b13;
ListNode c11 = new ListNode(3);
ListNode c12 = new ListNode(6);
ListNode c13 = new ListNode(9);
c11.next = c12;
c12.next = c13;
List<ListNode> list = new ArrayList<No22_MergeKSortedLists.ListNode>();
list.add(a11);
list.add(b11);
list.add(c11);
ListNode p = mergeKLists(list);
while(p!=null){
System.out.println(p.val);
p = p.next;
}
}

public static ListNode mergeKLists(List<ListNode> lists) {
int size = lists.size();
if(size == 0) return null;
if(size == 1) return lists.get(0);
ListNode head = new ListNode(0);
ListNode node = head;
ListNode first = mergeKLists(lists.subList(0, size/2));
ListNode second = mergeKLists(lists.subList(size/2, size));
while(first!=null && second!=null){
if(first.val < second.val){
node.next = first;
first = first.next;
node = node.next;
continue;
}
else{
node.next = second;
second = second.next;
node = node.next;
continue;
}
}
if(first == null){
node.next = second;
}
else{
node.next = first;
}
return head.next;
}

// public static ListNode mergeKLists(List<ListNode> lists) {
// if(lists.size() == 0)
// return null;
// if(lists.size() == 1)
// return lists.get(0);
// ListNode head = new ListNode(0);
// ListNode node = head;
// while(true){
// int index = 0;
// for(int i=0;i<lists.size();i++){
// if(lists.get(i) == null)
// continue;
// if(lists.get(index) == null || lists.get(index).val > lists.get(i).val)
// index = i;
// }
// node.next = lists.get(index);
// node = node.next;
// if(lists.get(index) == null ) break;
// lists.set(index, lists.get(index).next);
// int nullcount = 0;
// for(int i=0;i<lists.size();i++){
// if(lists.get(i) == null)
// nullcount++;
// }
// if(nullcount == lists.size())
// break;
// }
// return head.next;
//}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 算法