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;
    }
}
原文地址:https://www.cnblogs.com/lzh1043060917/p/15238335.html