英文免费注册网站,备案 个人网站名称,在那个网站上做设计赚钱,韩韩良品只做性价比网站下载给你一个链表数组#xff0c;每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中#xff0c;返回合并后的链表。 示例 1#xff1a;
输入#xff1a;lists [[1,4,5],[1,3,4],[2,6]]
输出#xff1a;[1,1,2,3,4,4,5,6]
解释#xff1a;链表数组如下#…给你一个链表数组每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中返回合并后的链表。 示例 1
输入lists [[1,4,5],[1,3,4],[2,6]]
输出[1,1,2,3,4,4,5,6]
解释链表数组如下
[1-4-5,1-3-4,2-6
]
将它们合并到一个有序链表中得到。
1-1-2-3-4-4-5-6
示例 2
输入lists []
输出[]
示例 3
输入lists [[]]
输出[]
解题方法(最小堆)
1.创建最小堆优先队列然后开始将列表中的链表全部加入到堆中(a, b) - a.val - b.val 是一个自定义比较器用于比较两个 ListNode 的值使得堆始终保持最小的节点在顶部。
2.然后创建哨兵节点进入循环循环条件当 pq 不为空时执行以下操作 取出堆顶元素 node即当前所有节点中最小的。 如果 node 有下一个节点 node.next则将 node.next 加入 pq确保后续节点也能参与排序。 将 node 添加到新链表 cur.next node让当前指针 cur 指向 node即把 node 加入新链表。 cur cur.next移动 cur 指针以便继续添加下一个节点。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/
class Solution {public ListNode mergeKLists(ListNode[] lists) {PriorityQueueListNode pq new PriorityQueue((a, b) - a.val - b.val);for (ListNode head : lists) {if (head ! null) {pq.offer(head);}}ListNode dummy new ListNode();ListNode cur dummy;while (!pq.isEmpty()) {ListNode node pq.poll();if (node.next ! null) {pq.offer(node.next);}cur.next node;cur cur.next;}return dummy.next;}
}