題目描述
N個升序鏈表合併爲一個升序的鏈表
我的答案
import java.util.Scanner;
class Node{
int val;
Node next;
public Node(int val){
this.val = val;
}
}
public class Main {
private PriorityQueue<Node> minHeap;
public Node mergeList(List<Node> nodes){
// 定義小根堆,size爲序列個數
minHeap = new PriorityQueue<>(nodes.size(), new Comparator<Node>(){
public int compare(Node node1, Node node2){
return node1.val - node2.val;
}
});
// 初始化,將鏈表頭存入小根堆
for(Node node : nodes){
minHeap.offer(node);
}
// 合併
return mergeList(minHeap);
}
public Node mergeList(PriorityQueue<Node> minHeap){
// 遞歸結束條件 小根堆爲空,沒有元素。
if(minHeap.isEmpty()) return null;
// 每次把堆頂的元素poll出來,因爲他最小
Node node = minHeap.poll();
// 如果這個元素不是鏈表尾,就把這個元素的next加入小根堆
if(node.next != null) minHeap.offer(node.next);
// 該元素的next修正爲小根堆合併後的結果
node.next = mergeList(minHeap);
// 返回當前元素
return node;
}
}