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

LeetCode 160:相交链表解题思路与代码实现

综述由AI生成针对 LeetCode 第 160 题相交链表问题,提供了两种解决方案。暴力解法通过双重循环比较节点地址,时间复杂度为 O(n^2)。更优方案先计算两链表长度差,让长链表指针先行,随后双指针同步移动寻找交点,时间复杂度优化至 O(m + n),空间复杂度保持 O(1)。代码使用 C++ 实现,包含逻辑优化细节,适合面试准备与算法提升。

深海蔚蓝发布于 2026/3/16更新于 2026/6/816 浏览
LeetCode 160:相交链表解题思路与代码实现

LeetCode 160:相交链表

题目描述

给定两个单链表的头节点 headA 和 headB,找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 nullptr。

提高要求:时间复杂度为 O(m + n),空间复杂度为 O(1),其中 m 和 n 分别为两个链表的长度。

相交链表示意图 相交链表结构图 相交链表路径图

思路分析

暴力解法

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

具体操作如下:

  • 使用两个指针 curNode1 和 curNode2 分别迭代遍历两个链表。
  • 外层循环移动 curNode1,内层循环中 curNode2 从头开始遍历。
  • 当 curNode1 == curNode2 时,代表是相交的结点,直接返回当前结点。
  • 若内层循环结束仍未找到,curNode1 向后移动,curNode2 重置回 headB。
  • 循环结束后若未返回,说明无交点,返回 nullptr。

该方案时间复杂度为 O(n^2),空间复杂度为 O(1)。虽然满足空间要求,但在链表较长时效率较低。

while(curNode1){
    while(curNode2){
        if(curNode1 == curNode2) return curNode1;
        else curNode2 = curNode2->next;
    }
    curNode1 = curNode1->next;
    curNode2 = headB;
}
return nullptr;
快慢指针(长度差法)

为了优化时间复杂度,我们可以利用链表长度的特性。核心思想是让两个指针在剩余长度相同的情况下同时移动,这样它们到达交点的步数就一致了。

步骤如下:

  1. 计算长度:分别求出两个链表的长度。
  2. 对齐起点:让长链表的指针先向后移动两个链表长度的差距步数。
  3. 同步查找:两个迭代指针再同时移动,第一个地址相同的结点就是交点。

这样做的时间复杂度降到了 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;
    }

代码实现

暴力解法
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;
    }
};
长度差法优化版

在基础版本上,我们可以进一步精简逻辑。通过引入 longList 和 shortList 变量,减少 if-else 嵌套,使代码更清晰易读。

class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        ListNode* curNode1 = headA, *curNode2 = headB;
        
        // 分别求两个链表的长度
        size_t lengthA = getLength(headA);
        size_t lengthB = getLength(headB);
        
        // 确定长链表和短链表,以及长度差
        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. LeetCode 160:相交链表
  2. 题目描述
  3. 思路分析
  4. 暴力解法
  5. 快慢指针(长度差法)
  6. 代码实现
  7. 暴力解法
  8. 长度差法优化版
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于无人机的多模态目标检测:高多样性基准与基线方法
  • Linux Miniconda 安装教程与 conda 常用指令
  • 基于 CTCM 算法的复杂城市地形下无人机避障三维航迹规划
  • SpringBoot 整合 Neo4j 图数据库项目实战详解
  • Claude Opus 4.6 发布:1M Token 上下文与编码能力升级
  • MAVROS 安装与基础梳理:ROS C++ 仿真实战
  • ComfyUI 云服务器部署实战与优化指南
  • 2026 年程序员技术趋势:AI Agent、国产算力与云原生发展
  • ASP.NET Core Web API 控制器及方法常用注解属性详解
  • Vue 项目打包与部署指南
  • Vue 自定义指令详解
  • 雷达信号处理中的 CFAR 技术详解
  • C++ 哈希表核心机制:从哈希冲突到负载因子
  • AI 图像生成提示词进阶指南与最佳实践
  • 基于 AI 辅助的 Java 零基础入门与基础实战指南
  • HDFS 分布式存储原理:冗余、存取与恢复
  • 信奥赛C++提高组 CSP-S 树上前缀和
  • M1 Mac 使用 Homebrew 管理 Git 多版本及 IntelliJ 配置指南
  • 文心一言 4.5 开源模型深度解析:轻量化部署与多场景应用
  • 机器人表情模拟:Arduino 控制面部舵机项目

相关免费在线工具

  • 加密/解密文本

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