priorityQueue --minHeap O(n * k log(k)) time
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null || lists.length == 0) {
return null;
}
PriorityQueue<ListNode> minHeap = new PriorityQueue<ListNode>(lists.length, new Comparator<ListNode>() {
@Override
public int compare(ListNode node1, ListNode node2) {
if (node1.val == node2.val) {
return 0;
} else {
return node1.val > node2.val ? 1 : -1;
}
}
});
for(int i = 0; i < lists.length; i++) {
if(lists[i] != null) {
minHeap.offer(lists[i]);
}
}
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
while(!minHeap.isEmpty()) {
ListNode node = minHeap.poll();
if(node.next != null) {
minHeap.offer(node.next);
}
cur.next = node;
cur = cur.next;
}
return dummy.next;
}
}
Binary merge sort O ( n * k * log k) time,
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) {
return null;
}
return mergeSort(lists, 0, lists.length - 1);
}
private ListNode mergeSort(ListNode[] lists, int left, int right) {
if (left == right) {
return lists[left];
}
int mid = left + (right - left) / 2;
ListNode lnode = mergeSort(lists, left, mid);
ListNode rnode = mergeSort(lists, mid + 1, right);
return mergeTwoList(lnode, rnode);
}
private ListNode mergeTwoList(ListNode lnode, ListNode rnode) {
if(lnode == null && rnode == null) {
return null;
} else if (lnode != null && rnode == null) {
return lnode;
} else if (rnode != null && lnode == null) {
return rnode;
}
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
while(lnode != null && rnode != null) {
if(lnode.val <= rnode.val) {
cur.next = lnode;
cur = cur.next;
lnode = lnode.next;
} else {
cur.next = rnode;
cur = cur.next;
rnode = rnode.next;
}
}
if (lnode != null) {
cur.next = lnode;
}
if (rnode != null) {
cur.next = rnode;
}
return dummy.next;
}
}