题目
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
代码
class Solution {
static Comparator<ListNode> cLNode = new Comparator<ListNode>() {//自定义比较器,也可用lambda表达式
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
}
};
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) return null;
ListNode dummy = new ListNode(-1);// 虚拟头结点
ListNode p=dummy;
PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length,cLNode); // 优先级队列,最小堆,声明大小,比较器
for (ListNode head:lists
) {
if (head != null)
pq.add(head);//将 k 个链表的头结点加入最小堆
}
while (!pq.isEmpty()){
ListNode node=pq.poll();//获取最小值
p.next=node;
if (node.next!=null){
pq.add(node.next);//下一个加入堆
}
p=p.next;//指针前进
}
return dummy.next;
}
}
方法
- 使用堆排序,保证输出的是所有链表的最小值,依次输出即可
- 利用虚拟头结点,方便输出答案链表
- 比较器需自己定义