码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 合并k个已排序的链表


    合并k个已排序的链表-牛客

    思路

    使用归并排序,用递归实现。
    k个链表,相当于k个子问题,需要划分为链表数量更少的子问题,直到每一组合并时是两两合并,然后继续往上合并,这个过程基于递归:

    • 递归函数终止条件: 直到左右区间相等或左边大于右边。
    • 递归函数入参和返回值:入参:存放k个链表的lists、区间首、尾结点;返回值: 每级返回已经合并好的子问题链表。
    • 本层逻辑: 对半划分,将划分后的子问题合并成新的链表。

    合并:与合并两个排序链表相似,使用双指针,分别指向2个链表的表头,虚拟头结点为为新链表的表头

    步骤:
    1:从链表数组的首和尾开始,每次划分从中间开始划分,划分成两半,得到左边n/2n/2n/2个链表和右边n/2n/2n/2个链表。
    2:继续不断递归划分,直到每部分链表数为1.
    3:将划分好的相邻两部分链表,按照两个有序链表合并的方式合并,合并好的两部分继续往上合并,直到最终合并成一个链表

    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    #
    # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    #
    # 
    # @param lists ListNode类一维数组 
    # @return ListNode类
    #
    class Solution:
        def mergeKLists(self , lists: List[ListNode]) -> ListNode:
            # 归并排序:双指针+分治
            #K个链表归并排序
            return self.divideMerge(lists, 0, len(lists)-1)
        
        def Merge2(self, phead1, phead2) -> ListNode:
            #合并2个有序链表
            #一个已空,直接返回另一个
            if phead1==None:
                return phead2
            if phead2==None:
                return phead1
            #虚拟表头
            head=ListNode(0)
            cur=head
            #2个链表都不为空
            while phead1 and phead2:
                if phead1.val <= phead2.val:
                    cur.next=phead1
                    #只移动取值的指针
                    phead1=phead1.next
                else:
                    cur.next=phead2
                    phead2=phead2.next
                #虚拟指针后移
                cur=cur.next
            #哪个链表有剩,直接连后面
            if phead1:
                cur.next=phead1
            else:
                cur.next=phead2
            #返回值去掉虚拟头结点
            return head.next
                
        
        def divideMerge(self, lists, left, right) -> ListNode:
            #划分区间
            #递归终止条件
            if left > right:
                return
            elif left==right:
                return lists[left]
            else:
                #从中间分成两部分,再将排序好的两段合并
                mid=(left+right)//2
                return self.Merge2(self.divideMerge(lists, left, mid), self.divideMerge(lists, mid+1, right))       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    单片机:步进电机(内含:1 步进电机简介+2 步进电机工作原理+ 3 步进电机技术指标 +4. 软件设计+5.原始代码+6.实验现象)
    电机控制从入门到吹牛
    SpringBoot + LiteFlow:轻松应对复杂业务逻辑,简直不要太香!
    Docker的网络模式 (4+1)
    [构造]Build Permutation Codeforces1713C
    基于Faster R-CNN的安全帽目标检测
    域名限制注册有哪些原因?
    精彩回顾 l Rust唠嗑室:Xline跨数据中心一致性管理
    【计算机取证篇】Windows禁用驱动程序签名教程
    汽车空调手动抽排、加注制冷剂的技术要点(R134a)
  • 原文地址:https://blog.csdn.net/Lucky_main/article/details/125513217
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号