首页 > 其他分享 >合并K个有序链表

合并K个有序链表

时间:2024-07-31 20:55:30浏览次数:13  
标签:current head val 合并 next 链表 有序 节点

题目

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

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

示例1: 

        输入:lists=[[1,4,5],[1,3,4],[2,6]]

        输出:[1,1,2,3,4,4,5,6]
示例2:

        输入:lists = []

        输出:[]

示例3:

        输入:lists=[[]]

        输出:[]

解题

优先队列(最小堆)法

优先队列可以帮助我们每次从所有链表的头节点中找到最小的节点,将其放入合并后的链表中,然后从相应的链表中移除这个节点。具体步骤如下:

  1. 初始化优先队列

    • 对每个链表的头节点进行初始化,将其放入优先队列中。优先队列按节点的值进行排序。
  2. 构建合并后的链表

    • 每次从优先队列中取出最小节点,将其加入结果链表。
    • 如果该节点有下一个节点,则将下一个节点放入优先队列中。
  3. 返回结果

    • 最终,返回合并后的链表头节点。
from heapq import heappop, heappush


class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


def mergeKLists(lists):
    # 创建一个虚拟头节点
    dummy = ListNode(0)
    current = dummy

    # 定义一个最小堆
    heap = []

    # 初始化堆,将每个链表的头节点放入堆中
    for i, l in enumerate(lists):
        if l:
            heappush(heap, (l.val, i, l))

    # 合并链表
    while heap:
        val, i, node = heappop(heap)
        current.next = node
        current = current.next
        if node.next:
            heappush(heap, (node.next.val, i, node.next))

    return dummy.next


# 辅助函数:创建链表
def create_linked_list(values):
    if not values:
        return None
    head = ListNode(values[0])
    current = head
    for value in values[1:]:
        current.next = ListNode(value)
        current = current.next
    return head


# 辅助函数:打印链表
def print_linked_list(head):
    values = []
    while head:
        values.append(head.val)
        head = head.next
    print(" -> ".join(map(str, values)))


# 示例测试
if __name__ == '__main__':
    lists = [
        create_linked_list([1, 4, 5]),
        create_linked_list([1, 3, 4]),
        create_linked_list([2, 6])
    ]
    merged_head = mergeKLists(lists)
    print("合并后的链表:")
    print_linked_list(merged_head)

合并后的链表:
1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6 

  • 时间复杂度: 每个节点入堆和出堆的操作时间复杂度是O(logk),其中 k 是链表的数量。总的时间复杂度是 O(Nlogk),其中 N 是所有节点的总数。
  • 空间复杂度: 主要是堆的空间,最坏情况下是 O(k)

标签:current,head,val,合并,next,链表,有序,节点
From: https://blog.csdn.net/weixin_74254879/article/details/140808860

相关文章

  • 用Python打造精彩动画与视频,3.2 基本的剪辑和合并操作
     3.2基本的剪辑和合并操作在这一节中,我们将学习如何使用MoviePy库对视频进行基本的剪辑和合并操作。MoviePy是一个用于视频编辑的Python库,可以轻松地实现视频的剪辑、合并、添加音频等操作。准备工作首先,确保你已经安装了MoviePy库。你可以通过以下命令安装:pipins......
  • 代码随想录二刷(链表章节)
    代码随想录二刷(链表章节)链表就是通过指针串联在一起的线性结构,每个节点都是由一个数据域和指针域(存放下一个节点的指针)。双链表就是每个节点中既有指向前一个节点的,也有指向后一个节点的。循环链表就是把头和尾连起来。性能分析如下:下面来看下链表的具体题目:Leetcod......
  • Java使用EasyExcel自定义合并(横纵合并)、自定义行高列宽、自适应行高列宽工具Excel导出
    目录一、自适应行高列宽工具类1、自适应行高2、自适应列宽二、自定义行高列宽工具类1、自定义行高2、自定义列宽三、自定义合并工具类四、自定义样式五、实现Excel的完整代码最近又开始写Excel导出的业务,之前写的自适应行高列宽工具类并不满足现下的需求需求是导出......
  • P9746 「KDOI-06-S」合并序列
    mx练习赛搬的,虽然数据不咋样,但是一步步的优化思路确实值得一记。P9746合并序列题目大意:给你\(n(1\len\le500)\)个数\(a_1,a_2,\ldotsa_n\)(\(a_i<512\))。每次可以选一个3元组\((i,j,k)\),满足\(i<j<k\),并且\(a_i\oplusa_j\oplusa_k=0\),则你可以将$a_i\dotsa_k$......
  • T-SQL——关于将有序数据插入临时表
    目录0.背景1.解决方案1:使用ROW_NUMBER()OVER(ORDERBY……)2.解决方案2:给临时表创建聚集索引3.参考shanzm-2024年7月30日0.背景问题:需要将排序后的数据结果集插入到临时表中,少量数据发现没有任何问题,插入到临时表中的结果集保留了插入前的顺序。但是当待插入的临时表......
  • 合并两个数据帧时的内存问题
    我对倒数第二句话一无所知。错误是:numpy.core._exceptions.MemoryError:无法为形状为(7791676634)和数据类型为int64的数组分配58.1GiB我的想法是将约1200万条记录的数据帧与另一个数据帧合并多3-4列应该不是什么大问题。请帮帮我。完全被困在这里了。谢谢Select_Emp_df......
  • LLM并行训练7-混合并行总结
    概述根据前面的系列文章,对预训练大模型里用到的主要并行加速技术做了一系列拆分分析.但是在实际的训练里往往是多种并行混合训练.我们要怎么配置这些并行策略才能让训练框架尽可能的减少通信瓶颈,提升GPU计算利用率呢?这里的变量太多了,以最简单的3D并行为例:硬件层面有......
  • G73 线段树+线性基合并 P5607 [Ynoi2013] 无力回天 NOI2017
    视频链接:G73线段树+线性基合并P5607[Ynoi2013]无力回天NOI2017_哔哩哔哩_bilibili   P5607[Ynoi2013]无力回天NOI2017-洛谷|计算机科学教育新生态(luogu.com.cn)//线段树+线性基合并O(n*logn*logv*logv)#include<iostream>#include<cstring>#incl......
  • 判断链表是否有环
    题目要求给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 如何使用 Pandas 解析函数处理 Excel 中的合并单元格?
    我有一个包含合并的列和行的Excel文件,我想读取该Excel文件并解析它以将其转换为DataFrame。这只是所发生情况的一个小示例,因为我拥有的真实数据非常多很大,有很多桌子。这就是Excel文件的样子:当我尝试时xl=pd.read_excel('file')我得到了这个:......