[LintCode]Merge k Sorted Lists
Version I
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param lists: a list of ListNode
* @return: The head of one sorted list.
*/
public ListNode mergeKLists(List<ListNode> lists) {
// 2015-08-21
if (lists == null || lists.size() == 0) {
return null;
}
ListNode dummy = new ListNode(0);
ListNode tail = dummy; // sorted list的尾节点
// 这个数组保存了各链表中未排序的部分的表头
ArrayList<ListNode> headList = new ArrayList<>(lists);
while (true) {
int minValue = Integer.MAX_VALUE;
int indexOfMin = -1;
// 遍历数组,找到值最小的节点,并保存其序号
for (int i = 0; i < headList.size(); i++) {
ListNode temp = headList.get(i);
if (temp == null) {
continue;
}
if (minValue > temp.val) {
minValue = temp.val;
indexOfMin = i;
}
}
// 更新sorted list和headList
if (indexOfMin == -1) {
break;
} else {
ListNode minNode = headList.get(indexOfMin);
tail.next = minNode;
tail = tail.next;
headList.set(indexOfMin, minNode.next);
}
}
return dummy.next;
}
}
Version II 堆排序
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param lists: a list of ListNode
* @return: The head of one sorted list.
*/
private Comparator<ListNode> ListNodeComparator = new Comparator<ListNode>() {
public int compare(ListNode left, ListNode right) {
if (left == null) {
return 1;
} else if (right == null) {
return -1;
}
return left.val - right.val;
}
};
public ListNode mergeKLists(List<ListNode> lists) {
if (lists == null || lists.size() == 0) {
return null;
}
Queue<ListNode> heap = new PriorityQueue<ListNode>(lists.size(), ListNodeComparator);
for (int i = 0; i < lists.size(); i++) {
if (lists.get(i) != null) {
heap.add(lists.get(i));
}
}
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (!heap.isEmpty()) {
ListNode head = heap.poll();
tail.next = head;
tail = head;
if (head.next != null) {
heap.add(head.next);
}
}
return dummy.next;
}
}