Merge
public void merge(ListNode left, ListNode right) {
ListNode dummy = new ListNode(0);
int index = 0;
while (left != null && right != null) {
if (index % 2 == 0) {
dummy.next = left;
left = left.next;
} else {
dummy.next = right;
right = right.next;
}
dummy = dummy.next;
index++;
}
if (left != null) dummy.next = left;
else dummy.next = right;
}
- Heap, 把所有点都加入到heap中,然后再构建成一个新的LL,需要dummy node
- Divide and Conquer,不断分成左右两部分进行merge。构建的时候需要两个helper,一个是递归的helper来不断分割,另一个是merge两个list
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
PriorityQueue<ListNode> heap = new PriorityQueue<>(new Comparator<ListNode>() {
public int compare(ListNode n1, ListNode n2) {
return n1.val - n2.val;
}
});
ListNode dummy = new ListNode(0);
ListNode head = dummy;
for (ListNode node : lists) {
if (node != null)
heap.add(node);
}
while (!heap.isEmpty()) {
ListNode node = heap.poll();
head.next = node;
head = head.next;
if (node.next != null)
heap.add(node.next);
}
return dummy.next;
}