跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

LeetCode Hot 100 链表进阶:K 组翻转与归并排序

综述由AI生成链表操作是面试中的高频考点,聚焦于 LeetCode Hot 100 中的链表进阶题目。内容涵盖反转链表的三种典型场景,包括基础反转、指定区间反转以及 K 个一组翻转,详细剖析了指针移动的逻辑与断点连接技巧。此外,还讲解了如何利用快慢指针定位中点,结合归并排序思想实现链表的原地排序。通过 Python 代码实战,演示了哨兵节点在简化边界条件处理上的优势,帮助开发者深入理解链表结构的操作细节与性能优化。

w795471发布于 2026/3/26更新于 2026/6/1120 浏览
LeetCode Hot 100 链表进阶:K 组翻转与归并排序

一、链表反转进阶

1.1 基础反转 (LeetCode 206)

反转链表是链表操作中最基础的题型。核心在于维护三个指针:前驱 pre、当前 cur 和后继 nxt。每次迭代将当前节点的 next 指向前驱,然后整体后移。

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

class Solution:
    def reverseList(self, head):
        pre = None
        cur = head
        while cur:
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        return pre

1.2 部分反转 (LeetCode 92)

当需要反转指定区间 [left, right] 时,关键在于找到反转区间的'前一个节点'和'后一个节点'。使用哑节点(dummy node)可以方便地处理头节点变化的情况。

具体步骤如下:

  1. 遍历到 left - 1 位置,记录为 p0。
  2. 从 p0.next 开始执行标准的反转逻辑,循环次数为 right - left + 1。
  3. 注意连接断点,确保 p0.next 指向新的头,原头节点的 next 指向剩余部分。
class Solution:
    def reverseBetween(self, head, left, right):
        p0 = dummy = ListNode(next=head)
        # 移动到 left 的前一个位置
        for _ in range(left - 1):
            p0 = p0.next
        
        pre = None
        cur = p0.next
        # 执行反转
        for _ in range(right - left + 1):
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        
        # 连接断开的部分
        p0.next.next = cur
        p0.next = pre
        return dummy.next

1.3 K 个一组翻转 (LeetCode 25)

这是上述两个问题的组合。我们需要先判断剩余节点是否足够 k 个,如果不够则保持原样。

实现时,可以先统计链表总长度,或者每 k 步检查一次。这里采用先计算长度的方式,逻辑更直观。

class Solution:
    def reverseKGroup(self, head, k):
        n = 0
        cur = head
        while cur:
            n += 1
            cur = cur.next
        
        p0 = dummy = ListNode(next=head)
        pre = None
        cur = head
        
        while n >= k:
            n -= k
            for _ in range(k):
                nxt = cur.next
                cur.next = pre
                pre = cur
                cur = nxt
            
            # 连接上一段的尾部
            nxt = p0.next
            nxt.next = cur
            p0.next = pre
            p0 = nxt
        
        return dummy.next

二、链表排序

2.1 寻找中间节点 (LeetCode 876)

归并排序的关键是分治,而分治的第一步是找中点。快慢指针是标准解法:快指针走两步,慢指针走一步,当快指针到达末尾时,慢指针恰好在中间。

class Solution:
    def middleNode(self, head):
        t1 = t2 = head
        while t2 and t2.next:
            t1 = t1.next
            t2 = t2.next.next
        return t1

2.2 合并两个有序链表 (LeetCode 21)

合并过程相对简单,使用哨兵节点简化边界处理。比较两个链表当前节点的值,将较小的接入结果链表。

class Solution:
    def mergeTwoLists(self, list1, list2):
        cur = dummy = ListNode()
        while list1 and list2:
            if list1.val < list2.val:
                cur.next = list1
                list1 = list1.next
            else:
                cur.next = list2
                list2 = list2.next
            cur = cur.next
        cur.next = list1 if list1 else list2
        return dummy.next

2.3 排序链表 (LeetCode 148)

综合以上能力,我们可以实现完整的链表排序。递归终止条件是空表或单节点。之后分割链表,分别排序,最后合并。

class Solution:
    def sortList(self, head):
        if not head or not head.next:
            return head
        
        # 分割
        slow = fast = head
        pre = None
        while fast and fast.next:
            pre = slow
            slow = slow.next
            fast = fast.next.next
        pre.next = None
        
        # 递归排序
        l1 = self.sortList(head)
        l2 = self.sortList(slow)
        
        # 合并
        return self.mergeTwoLists(l1, l2)

目录

  1. 一、链表反转进阶
  2. 1.1 基础反转 (LeetCode 206)
  3. 1.2 部分反转 (LeetCode 92)
  4. 1.3 K 个一组翻转 (LeetCode 25)
  5. 二、链表排序
  6. 2.1 寻找中间节点 (LeetCode 876)
  7. 2.2 合并两个有序链表 (LeetCode 21)
  8. 2.3 排序链表 (LeetCode 148)
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • CC-Switch 跨平台 AI 编码助手配置管理工具
  • 银河麒麟 V11-2503 安装指南:6.6 内核与 AI 特性详解
  • GLM-4.6V-Flash-WEB 检测明显 PS 伪造图像的能力分析
  • TS3AudioBot 完整指南:从零打造 TeamSpeak 音乐机器人
  • 实战应用:用 Whisper-large-v3 快速搭建多语言语音转文字服务
  • 基于 SpringBoot 的电影院票务预定系统设计
  • llama-cpp-python 本地推理引擎部署指南
  • 宇树 Unitree 机器人 ROS 2 环境部署指南 (Go2/B2/H1)
  • 大模型应用中的 Prompt 提示词管理与优化实践
  • 基于 Q-Learning 的无人机三维动态避障路径规划 (Matlab 实现)
  • Whisper 音频转录工具使用指南
  • OpenClaw 实战:构建多功能 AI 数字替身与场景应用
  • Vue 实例劫持突破 Web 编辑器粘贴限制
  • JavaAI 辅助生成 SpringBoot 项目的实战流程与效果评估
  • C++内联汇编详解:常见问题、陷阱与最佳实践
  • 接入第三方 OpenAI 兼容模型到 GitHub Copilot
  • VS Code Copilot 接入第三方 OpenAI 兼容模型配置指南
  • 煎蛋侠:开箱即用的 AI 桌面助手,支持 Skills 和 MCP 扩展
  • JavaScript 与 TypeScript 的本质区别、优缺点及语法差异详解
  • 二分查找算法核心逻辑与实战题解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online