【LeetCode每日一题】——LCR 078.合并 K 个升序链表

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目注意】
  • 六【题目示例】
  • 七【题目提示】
  • 八【解题思路】
  • 九【时间频度】
  • 十【代码实现】
  • 十一【提交结果】

一【题目类别】

二【题目难度】

  • 困难

三【题目编号】

  • LCR 078.合并 K 个升序链表

四【题目描述】

五【题目注意】

  • 本题与主站 23 题相同: https://leetcode-cn.com/problems/merge-k-sorted-lists/

六【题目示例】

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

七【题目提示】

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

八【解题思路】

  • 使用优先队列小顶堆)解决该问题
  • 小顶堆维护各个链表没有被合并的的节点的最前面的节点
  • 这样我们每次都会取出所有链表中值最小的节点
  • 然后依次将所有节点存入小顶堆中再将其合并为一个链表
  • 最后返回结果即可

九【时间频度】

  • 时间复杂度: O ( k n × l o g k ) O(kn × logk) O(kn×logk) k k k优先队列中的元素个数, n n n为传入的链表个数
  • 空间复杂度: O ( k ) O(k) O(k) k k k优先队列中的元素个数

十【代码实现】

  1. Java语言版
/**
 * 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 {

    // 定义一个类 Status,用来存储链表节点值和对应的节点指针
    class Status implements Comparable<Status> {
        int val;
        ListNode node;

        // 构造函数,初始化节点值和指针
        Status(int val, ListNode node) {
            this.val = val;
            this.node = node;
        }

        // 实现 Comparable 接口,按照节点值从小到大排序
        public int compareTo(Status status) {
            return this.val - status.val;
        }
    }

    // 合并多个有序链表
    public ListNode mergeKLists(ListNode[] lists) {
        // 定义一个优先队列小顶堆),会根据 Status 类中的节点值进行排序
        PriorityQueue<Status> pQueue = new PriorityQueue<Status>();

        // 遍历所有链表,把每个链表的第一个节点放入优先队列
        for (ListNode node : lists) {
            if (node != null) {
                pQueue.offer(new Status(node.val, node));
            }
        }

        // 创建一个虚拟头节点和尾节点,方便构建结果链表
        ListNode head = new ListNode(0);
        ListNode tail = head;

        // 循环处理优先队列中的节点,直到队列为空
        while (!pQueue.isEmpty()) {
            Status min_node = pQueue.poll();
            tail.next = min_node.node;
            tail = tail.next;
            if (min_node.node.next != null) {
                pQueue.offer(new Status(min_node.node.next.val, min_node.node.next));
            }
        }
        // 返回合并后的链表(哑节点的下一个节点)
        return head.next;
    }
}
  1. Python语言版
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

import heapq

class Solution:

    # 定义一个类 Status,用来存储链表节点值和对应的节点指针
    class Status:

        # 构造函数,初始化节点值和指针
        def __init__(self, val, node):
            self.val = val
            self.node = node

        # 实现接口,按照节点值从小到大排序
        def __lt__(self, other):
            return self.val < other.val

    # 合并多个有序链表
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        # 定义一个优先队列小顶堆),会根据 Status 类中的节点值进行排序
        pQueue = []

        # 遍历所有链表,把每个链表的第一个节点放入优先队列
        for node in lists:
            if node is not None:
                heapq.heappush(pQueue, self.Status(node.val, node))
        
        # 创建一个虚拟头节点和尾节点,方便构建结果链表
        head = ListNode(0)
        tail = head

        # 循环处理优先队列中的节点,直到队列为空
        while pQueue:
            min_node = heapq.heappop(pQueue)
            tail.next = min_node.node
            tail = tail.next
            if min_node.node.next is not None:
                heapq.heappush(pQueue, self.Status(min_node.node.next.val, min_node.node.next))
        
        # 返回合并后的链表(哑节点的下一个节点)
        return head.next
  1. C++语言版
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

class Status {
    public:
        int val;
        ListNode* node;

        Status(int v, ListNode* n) : val(v), node(n) {}

        bool operator<(const Status& other) const {
            return val > other.val;
        }
};

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        std::priority_queue<Status> pQueue;

        for (ListNode* node : lists) {
            if (node != nullptr) {
                pQueue.push(Status(node->val, node));
            }
        }

        ListNode* head = new ListNode(0);
        ListNode* tail = head;

        while (!pQueue.empty()) {
            Status min_node = pQueue.top();
            pQueue.pop();
            tail->next = min_node.node;
            tail = tail->next;
            if (min_node.node->next != nullptr) {
                pQueue.push(Status(min_node.node->next->val, min_node.node->next));
            }
        }

        ListNode* result = head->next;
        delete head;
        return result;
    }
};

十一【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C++语言版
    在这里插入图片描述


http://www.niftyadmin.cn/n/5664583.html

相关文章

9.15日常记录

1.今日复习 104.二叉树最大深度&#xff0c;100.相同的树(判断条件有误)&#xff0c;226.翻转二叉树&#xff0c;101.对称二叉树&#xff08;满足的四个条件1.左右不为空且值不相等2.左右为空3.左不为空&#xff0c;右为空4.左为空。右不为空&#xff09; 2.简单实现string类…

深度学习的笔记

1. 从huggingface上仅下载pytorch模型权重和配置文件到服务器 import os import shutil from huggingface_hub import snapshot_download# 直接指定模型和下载路径 model_name openai/clip-vit-base-patch32 download_path /home/xxx/.cache/huggingface/hub/models--anas-a…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…

VCC与GND之间电容起到什么作用?

一、VDD与GND之间并联多个电容 VDD与GND之间并联多个电容在电子电路中主要用于滤波、去耦和旁路等作用&#xff0c;以提高电路的稳定性和可靠性。 电源滤波 平滑电压&#xff1a;并联电容可以滤除电源中的杂波和交流成分&#xff0c;使直流电压更加平滑。这对于稳定电源输出非…

多旅行商问题:鹈鹕优化算法(Pelican Optimization Algorithm,POA)求解多仓库多旅行商问题MD-MTSP(提供Matlab代码)

一、鹈鹕优化算法 鹈鹕优化算法(Pelican Optimization Algorithm,POA)由Pavel Trojovsk和Mohammad Dehghani 于2022年提出&#xff0c;该算法模拟了鹈鹕在狩猎过程中的自然行为。 鹈鹕很大&#xff0c;喙很长&#xff0c;喉咙里有一个大袋子&#xff0c;用来捕捉和吞咽猎物。…

力扣之181.超过经理收入的员工

文章目录 1. 181.超过经理收入的员工1.1 题干1.2 准备数据1.3 题解1.4 结果截图 1. 181.超过经理收入的员工 1.1 题干 表&#xff1a;Employee -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | salary | int | | mana…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

2022年十九届中国研究生数学建模竞赛C题——优秀论文分析

● 引言&#xff1a;因为最近要参加研究生数学建模竞赛了&#xff08;第二十一届&#xff09;&#xff0c;学习和分析一下优秀的数模论文的&#xff1a;思路、写作。 虽然我说是 “优秀论文分析”&#xff0c;但其实更多是 “搬运” 哈哈哈… ✅ NLP 研 1 选手的学习笔记 笔者…