23. 合并K个升序链表 Java

Posted 可持续化发展

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23. 合并K个升序链表 Java相关的知识,希望对你有一定的参考价值。

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 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 = [[]]
输出:[]

参考链接

PriorityQueue 小根堆和大根堆的讨论_大树叶 技术专栏-CSDN博客_priorityqueue默认是大根堆还是小根堆

掘金

【Java】 用PriorityQueue实现最大最小堆 - 华仔要长胖 - 博客园

破解版

import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * 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) {
        /**
         * 用PriorityQueue + Comparator 实现小顶堆
         */
        PriorityQueue<ListNode> minHeap = new PriorityQueue<ListNode>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode t1, ListNode t2) {
                return t1.val - t2.val;
            }
        });
        //建立一个虚拟头节点
        ListNode dummy = new ListNode(-1);
        //初始化 尾指针
        ListNode tail = dummy;
        //生成 最小堆,要注意对链表头节点判空
        for (ListNode l: lists){
            if (l != null){
                minHeap.offer(l);
            }
        }
        while (minHeap.size() != 0){
            //取出最小堆的堆顶节点
            ListNode temp = minHeap.poll();
            //尾指针指向堆顶节点(它是一个链表头节点),并移动尾指针
            tail = tail.next = temp;
            //看一下堆顶节点所在的链表后面是否还有链表节点,如果还有链表节点的话,需要把后继链表节点加入堆中。
            if (temp.next != null){
                minHeap.offer(temp.next);
            }
        }
        return dummy.next;
    }
}

纯净版

import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * 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) {
        PriorityQueue<ListNode> minHeap = new PriorityQueue<ListNode>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode t1, ListNode t2) {
                return t1.val - t2.val;
            }
        });
        ListNode dummy = new ListNode(-1);
        ListNode tail = dummy;
        for (ListNode l: lists){
            if (l != null){
                minHeap.offer(l);
            }
        }
        while (minHeap.size() != 0){
            ListNode temp = minHeap.poll();
            tail = tail.next = temp;
            if (temp.next != null){
                minHeap.offer(temp.next);
            }
        }
        return dummy.next;
    }
}

以上是关于23. 合并K个升序链表 Java的主要内容,如果未能解决你的问题,请参考以下文章

23. 合并K个升序链表 Java

23. 合并K个升序链表 Java

题目地址(23. 合并K个升序链表)

算法leetcode|23. 合并K个升序链表(rust重拳出击)

算法leetcode|23. 合并K个升序链表(rust重拳出击)

23. 合并K个升序链表