题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if (lists == null || lists.isEmpty()) {
return null;
}
// 创建一个优先队列,使用 Lambda 表达式来定义比较器
PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> a.val - b.val);
// 将每个链表的头节点添加到优先队列中
for (ListNode node : lists) {
if (node != null) {
queue.offer(node);
}
}
// 创建一个虚拟头节点
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
// 从优先队列中不断取出节点,并将其添加到结果链表中
while (!queue.isEmpty()) {
ListNode node = queue.poll();
tail.next = node;
tail = tail.next;
// 如果取出的节点还有下一个节点,则将其下一个节点添加到优先队列中
if (node.next != null) {
queue.offer(node.next);
}
}
return dummy.next; // 返回合并后的链表的头节点
}
}
代码思路,把所有链表的头节点都放入升序的优先队列中,每次取出优先队列中最小的头节点,如果该链表不止头节点,就把该链表的新头节点在加入优先队列中即可。
新使用的代码的介绍:
Lambda 表达式
Lambda表达式是Java 8引入的一种新特性,它提供了一种简洁的方式来实现匿名函数。在您的代码中,Lambda表达式用于定义优先队列中元素的比较逻辑。
java
复制
PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> a.val - b.val);
这行代码创建了一个优先队列,其中ListNode按其val属性升序排列。Lambda表达式(a, b) -> a.val - b.val定义了比较器。这里,a和b是优先队列中的两个ListNode对象,表达式返回的是a的val减去b的val的值。这意味着如果a.val小于b.val,则a会排在b前面。
offer 方法
offer方法是PriorityQueue类的一个方法,用于将一个元素插入到优先队列中。这个方法会根据队列的比较器(在这里是Lambda表达式定义的比较器)来决定元素的插入位置。
java
复制
if (node != null) {
queue.offer(node);
}
这行代码检查node是否为null,如果不是,则将其添加到优先队列中。
poll 方法
poll方法也是PriorityQueue类的一个方法,用于从优先队列中取出并移除队列头部(最小的元素)。如果队列为空,poll方法将返回null。
java
复制
ListNode node = queue.poll();
这行代码从优先队列中取出最小的节点(根据我们之前定义的比较器)。
查看12道真题和解析