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

LeetCode 链表专题:分割、相交及环形链表 C++ 解法

介绍 C++ 解决 LeetCode 四个链表问题的方法。涵盖链表分割(利用哨兵节点拆分)、相交链表(计算长度差后同步遍历)、环形链表检测(快慢指针相遇判断)及入环节点查找(快慢指针距离推导)。重点展示双指针技巧在链表操作中的应用及代码实现细节。

林间仙子发布于 2026/3/22更新于 2026/5/286.9K 浏览
LeetCode 链表专题:分割、相交及环形链表 C++ 解法

在这里插入图片描述

在这里插入图片描述

一、链表分割

题目链接:链表分割

题目描述如下:

在这里插入图片描述

本题基于 C++ 类实现,代码编写位置遵循题目提示。

题目要求将链表分割,值小于 x 的节点放在左边,大于等于 x 的节点放在右边。方法类似双指针算法。我们可以创建两个新链表,分别存放比 x 小的节点和比 x 大或相等的节点,最后连接。

为避免空链表判断繁琐,使用哨兵节点占位,无需判断链表是否为空。

解题思路:创建大小链表及哨兵位,遍历原链表分配节点,连接首尾。

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        ListNode* lesshead, *lesstail;
        ListNode* greaterhead, *greatertail;
        lesshead = lesstail = (ListNode*)malloc(sizeof(ListNode));
        greaterhead = greatertail = (ListNode*)malloc(sizeof(ListNode));
        ListNode* pcur = pHead;
        while(pcur) {
            if(pcur->val < x) {
                lesstail->next = pcur;
                lesstail = pcur;
            } else {
                greatertail->next = pcur;
                greatertail = pcur;
            }
            pcur = pcur->next;
        }
        lesstail->next = greaterhead->next;
        greatertail->next = NULL;
        ListNode* ret = lesshead->next;
        free(lesshead);
        free(greaterhead);
        lesshead = NULL;
        greaterhead = NULL;
        return ret;
    }
};

在这里插入图片描述

二、相交链表

题目链接:相交链表

题目要求判断两链表是否相交,若相交返回相交节点,否则返回空。

链表相交后只有一个方向。若同时开始遍历,因长度不同可能无法相遇。需计算长度差,让长链表先走差距步,再同步遍历。

struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
    struct ListNode* tailA = headA;
    struct ListNode* tailB = headB;
    int lenA = 1, lenB = 1;
    while(tailA->next) { tailA = tailA->next; ++lenA; }
    while(tailB->next) { tailB = tailB->next; ++lenB; }
    if(tailA != tailB) return NULL;
    int gap = abs(lenA - lenB);
    struct ListNode* longlist = headA, *shortlist = headB;
    if(lenA < lenB) { longlist = headB; shortlist = headA; }
    while(gap--) { longlist = longlist->next; }
    while(shortlist) {
        if(longlist == shortlist) return longlist;
        longlist = longlist->next;
        shortlist = shortlist->next;
    }
    return NULL;
}

在这里插入图片描述

三、环形链表 I

题目链接:环形链表 |

带环指尾结点的 next 指针指向链表中某个节点。

本题只需判断是否有环。基于快慢指针结论:若带环,快指针(一次两步)和慢指针(一次一步)必在环内相遇。

bool hasCycle(struct ListNode* head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast) return true;
    }
    return false;
}

在这里插入图片描述

四、环形链表 II

题目链接:环形链表 ||

本题还需找出入环的第一个节点。

结论:相遇节点到入环节点的距离,等于头结点到入环节点的距离。即头结点与慢指针同时同速前进,相遇处即为入环点。

struct ListNode* detectCycle(struct ListNode* head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast) {
            struct ListNode* pcur = head;
            while(pcur) {
                if(pcur == slow) return pcur;
                pcur = pcur->next;
                slow = slow->next;
            }
        }
    }
    return NULL;
}

在这里插入图片描述

目录

  1. 一、链表分割
  2. 二、相交链表
  3. 三、环形链表 I
  4. 四、环形链表 II
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Python 开发工具 uv 安装、配置与最佳实践
  • 2023 年网络安全 HW 行动蓝队面试常见问题与解答
  • AI 产品经理核心能力模型与系统学习路径
  • Python 临床知识问答与检索系统架构设计与实现
  • 滑动窗口算法实战:最小长度子数组与最长无重复子串
  • 资深安全工程师:十年自学经验与成长路径指南
  • Docker Compose 多实例 Tomcat 部署示例
  • Stable Diffusion AI 绘画入门与实战指南
  • 实用 AI 写作平台推荐:涵盖日常、论文及职场场景
  • 文心一言 4.5 评测与本地部署指南:开源大模型的中文能力实测
  • JavaScript 基础语法与 jQuery 快速入门
  • Python 环境安装与 Pip 配置完整指南
  • Vue3 开发中方法未定义报错排查:Composition API 作用域与暴露机制
  • Java 常见异常梳理
  • 生产环境 Nginx 双机热备部署 - Keepalived 多模式配置
  • WebGPU 全面解析:新一代 Web 图形与计算 API
  • C++ 不使用第三方库在 RGB 图像上叠加文字
  • C++ STL 算法实战:序列操作、排序与数值处理
  • 零基础学习网络安全:核心方向、岗位与入门路径详解
  • 使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱

相关免费在线工具

  • 加密/解密文本

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

  • Gemini 图片去水印

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

  • Base64 字符串编码/解码

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

  • Base64 文件转换器

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

  • Markdown转HTML

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

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online