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

LeetCode 160 相交链表

综述由AI生成讲解 LeetCode 第 160 题相交链表的解法。题目要求找出两个单链表相交的起始节点,若不相交则返回空指针。文章提供了两种思路:暴力解法通过双重循环比较节点地址,时间复杂度为 O(n^2);优化方案先计算两链表长度差,让长链表指针先行,再同步移动寻找交点,时间复杂度 O(m+n),空间复杂度 O(1)。代码使用 C++ 实现,包含基础实现与逻辑优化版本。

深海蔚蓝发布于 2026/3/30更新于 2026/5/3129 浏览
LeetCode 160 相交链表

题目描述

题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

图片描述

图片描述

图片描述

题目与思路分析

目标分析:

  1. 给定两个单链表的头节点 headA 和 headB,找出并返回两个单链表相交的起始节点。
  2. 如果两个链表不存在相交节点,返回 nullptr。
  3. 提高要求:时间复杂度为 O(m + n),空间复杂度为 O(1),其中 m 和 n 分别为两个链表的长度。

思路一:暴力解法

思路:两层循环遍历链表 A 和链表 B,将链表 A 中的每个结点的地址都和链表 B 中的每个结点的地址进行比较,如果地址相等,则相交。

操作:

  • ListNode* curNode1 = headA, *curNode2 = headB:curNode1和curNode2分别用于迭代遍历两个链表。
  • 链表 A 中的每个节点需要和链表 B 中的每个结点进行比较。
    • curNode1 == curNode2时:代表是相交的结点,返回当前结点即可。
    • else:内层循环中,curNode2移向下一个节点。
  • 内层循环结束一轮后:
    • 链表 A 的 curNode1向后移动:curNode1 = curNode1->next。
    • 链表 B 的迭代结点回到链表 B 的头结点,准备进行下一轮遍历:curNode2 = headB;。
  • 循环内没有 return 时,代表没有相交。循环结束后 return nullptr;。
  • 时间复杂度 ,空间复杂度 。
O(n^2)
O(1)
while(curNode1){
    while(curNode2){
        if(curNode1 == curNode2) return curNode1;
        else curNode2 = curNode2->next;
    }
    curNode1 = curNode1->next;
    curNode2 = headB;
}

思路二:快慢指针

思路:快慢指针解法。

  1. 先分别求两个链表的长度。
  2. 长的链表的 curNode 指针先向后移动两个链表长度的差距步。
  3. 两个迭代指针再同时移动,第一个地址相同的结点就是交点。

操作:

  • ListNode* curNode1 = headA, *curNode2 = headB:curNode1和curNode2分别用于迭代遍历两个链表。
  • 求链表长度的子函数。
  • 分别求两个链表的长度:
    • size_t lengthA = getLength(headA),size_t lengthB = getLength(headB);
  • 比较两个链表的长度,长的链表的 curNode 指针先移动差距步。
  • 再让两个 curNode 指针同时移动,第一个相同的地址就是交点。
  • 时间复杂度 O(m + n),空间复杂度 O(1)。
private: 
size_t getLength(ListNode* list){ 
    ListNode* curNode = list; 
    size_t length =0;
    while(curNode){
        ++length; 
        curNode = curNode->next;
    }
    return length;
}

图片描述

代码实现

思路一:暴力解法

  • 暴力解法:时间复杂度 O(n^2),空间复杂度 O(1)。
// 暴力解法 O(n^2)
class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        ListNode* curNode1 = headA, *curNode2 = headB;
        while(curNode1){
            while(curNode2){
                if(curNode1 == curNode2) return curNode1;
                else curNode2 = curNode2->next;
            }
            curNode1 = curNode1->next;
            curNode2 = headB;
        }
        return nullptr;
    }
};

思路二:快慢指针

  • 快慢指针解法:时间复杂度 O(m + n),空间复杂度 O(1),其中 m 和 n 分别为两个链表的长度。
// 时间复杂度为 O(m + n) 的解法
class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        ListNode* curNode1 = headA, *curNode2 = headB;
        // 分别求两个链表的长度
        size_t lengthA = getLength(headA);
        size_t lengthB = getLength(headB);
        // 长的链表先走差距步
        if(lengthA > lengthB){
            size_t gap = lengthA - lengthB;
            while(gap--) curNode1 = curNode1->next;
        } else {
            size_t gap = lengthB - lengthA;
            while(gap--) curNode2 = curNode2->next;
        }
        // 两个链表再同时走,第一个相同的地址就是交点
        while(curNode1){
            if(curNode1 == curNode2) return curNode1;
            else{
                curNode1 = curNode1->next;
                curNode2 = curNode2->next;
            }
        }
        return nullptr;
    }
private:
    size_t getLength(ListNode* list){
        ListNode* curNode = list;
        size_t length =0;
        while(curNode){
            ++length;
            curNode = curNode->next;
        }
        return length;
    }
};

算法代码优化

  • 思路二代码优化:优化比较链表长度的逻辑,减少逻辑重复的代码。
// 优化找长链表的逻辑 时间复杂度为 O(m + n) 的解法
class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        ListNode* curNode1 = headA, *curNode2 = headB;
        // 分别求两个链表的长度
        size_t lengthA = getLength(headA);
        size_t lengthB = getLength(headB);
        // 长的链表先走差距步
        // 优化找长的链表的逻辑,假设 A 比 B 长,再加一个修正假设的逻辑
        ListNode* longList = headA, *shortList = headB;
        size_t gap = lengthA - lengthB;
        if(lengthA < lengthB){
            longList = headB;
            shortList = headA;
            gap = lengthB - lengthA;
        }
        // 长链表先走差距步
        while(gap--) longList = longList->next;
        // 两个链表再同时走,第一个相同的地址就是交点
        while(longList){
            if(longList == shortList) return longList;
            else{
                longList = longList->next;
                shortList = shortList->next;
            }
        }
        return nullptr;
    }
private:
    size_t getLength(ListNode* list){
        ListNode* curNode = list;
        size_t length =0;
        while(curNode){
            ++length;
            curNode = curNode->next;
        }
        return length;
    }
};

目录

  1. 题目描述
  2. 题目与思路分析
  3. 思路一:暴力解法
  4. 思路二:快慢指针
  5. 代码实现
  6. 思路一:暴力解法
  7. 思路二:快慢指针
  8. 算法代码优化
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Windows 下创建与激活 Python 虚拟环境指南
  • Spring Cloud Gateway 动态路由管理平台:Web UI 实时配置
  • 66 个机器人开源项目精选:科研、教育、工业与医疗全领域覆盖
  • DeepSeek 深度使用指南:提示词工程与本地知识库搭建
  • VS Code 远程连接服务器后 GitHub Copilot 无法使用
  • DeepSeek 与通义万相结合高效制作 AI 视频实战详解
  • 云电脑 AIGC 性能实测:ToDesk、顺网云与青椒云对比
  • Spring AOP 详解:代理模式与动态代理核心原理
  • AI 零基础入门指南:从概念到实践
  • LazyLLM 框架实战:构建代码专家智能体
  • Windows 23H2 Copilot 关闭方案:隐藏图标与注册表禁用
  • GEO 多平台 AI 监控系统实战:支持 ChatGPT、豆包等
  • MoltBot 接入钉钉 Stream 流式接口配置详解
  • OpenClaw + MCP 对接 143 种工具打造全场景 AI 自动化流水线
  • VMware 17 Ubuntu 虚拟机与宿主机复制粘贴失效修复
  • 深度解析 MySQL 与 MCP 集成:从环境构建到 AI 驱动的数据交互全流程
  • 三菱 R 系列 PLC 高端应用:远程 IO、机器人通信与多屏配方
  • CC-Switch:AI 编码助手的一站式配置管理工具
  • AI 编程实战:使用 TRAE CN 将 MasterGo 设计稿转为前端代码
  • OpenClaw 配置与 QQ 机器人接入指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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