题解 | #合并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();
这行代码从优先队列中取出最小的节点(根据我们之前定义的比较器)。