java优先队列,以及如何自定义优先队列的插入顺序-算法题-笔试考过
思路:我们需要维护当前每个链表没有被合并的元素的最前面一个,kk 个链表就最多有 kk 个满足这样条件的元素,每次在这些元素里面选取 val 属性最小的元素合并到答案中。在选取最小元素的时候,我们可以用优先队列来优化这个过程。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/he-bing-kge-pai-xu-lian-biao-by-leetcode-solutio-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码:
/** * 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 { class Status implements Comparable<Status> { // 某个节点的数值与指针 int val; ListNode ptr; // 构造函数 public Status(int val, ListNode ptr) { this.val = val; this.ptr = ptr; } // 在优先队列里面,以升序排列 public int compareTo(Status status2) { return this.val - status2.val; } } public ListNode mergeKLists(ListNode[] lists) { // 创建优先队列 PriorityQueue<Status> queue = new PriorityQueue<>(); ListNode pre = new ListNode(0); ListNode preHead = pre; // 我们需要维护当前每个链表没有被合并的元素的最前面一个,k 个链表就最多有 k 个满足这样条件的元素,每次在这些元素里面选取 val 属性最小的元素合并到答案中。在选取最小元素的时候,我们可以用优先队列来优化这个过程。 for (ListNode node : lists) { if (node != null) { queue.offer(new Status(node.val, node)); } } while (!queue.isEmpty()) { // 取出优先队列的头元素,也就是最小元素 Status cur = queue.poll(); // 连接到pre节点上 pre.next = cur.ptr; pre = pre.next; // 把这个最小元素的next加入优先队列 if (cur.ptr.next != null) { queue.offer(new Status(cur.ptr.next.val, cur.ptr.next)); } } return preHead.next; } }