题解 | #牛群的合并# java

牛群的合并

https://www.nowcoder.com/practice/d0cb24e1494e4f45a4b7d1a17db0daef

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param lists ListNode类一维数组
     * @return ListNode类
     */
    public ListNode mergeKLists (ListNode[] lists) {
        // write code here
// 特殊情况处理
        if (lists == null || lists.length == 0) {
            return null;
        }

        PriorityQueue<ListNode> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);
        // 将所有链表的头节点加入最小堆
        for (ListNode node : lists) {
            if (node != null) {
                minHeap.offer(node);
            }
        }

        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        // 不断从最小堆中取出当前最小的节点,将其接到结果链表中,并将下一个节点加入最小堆
        while (!minHeap.isEmpty()) {
            ListNode node = minHeap.poll();
            curr.next = node;
            curr = curr.next;
            if (node.next != null) {
                minHeap.offer(node.next);
            }
        }

        return dummy.next;
    }
    }

首先,创建一个最小堆(PriorityQueue),指定比较器为根据节点值的升序排列。

然后,遍历输入的链表数组,将每个链表的头节点加入最小堆。注意,在添加之前需要判断节点是否为空。

创建一个虚拟头节点 dummy 和一个指针 curr,用于构建合并后的结果链表。开始循环,不断从最小堆中取出当前最小的节点,将其接到结果链表的尾部,并将 curr 指向新加入的节点。同时,如果当前节点还有下一个节点,将其加入最小堆。

返回 dummy.next,即合并后的链表头节点。

该题考察的知识点是合并 k 个有序链表。

解题思路是使用最小堆(PriorityQueue)来实现合并。首先将所有链表的头节点加入最小堆中,然后从最小堆中取出当前最小的节点,将其接到结果链表中,并将下一个节点加入最小堆。重复这个过程直到最小堆为空。

全部评论

相关推荐

不像现在的我,已经是虚伪的社会人了。
真烦好烦真烦:好有个性的一段话,导师没有让你修改吗
点赞 评论 收藏
分享
05-07 13:29
已编辑
门头沟学院 Java
北斗导航Compass低仿版:能不能先搞清楚优先级啊,怎么可能是项目问题,项目很重要吗?又没学历 又没实习大厂凭啥约面?那玩具项目 没应用在真实生产环境下的 就算做上天又有什么用?早点找个小公司实习 拿小公司实习去投大厂实习,这才是你现在该做的
投递美团等公司10个岗位 简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务