当前位置: 首页 > news >正文

【LeetCode_160】相交链表

刷爆LeetCode系列

  • LeetCode第160题:
  • github地址
  • 前言
  • 题目描述
  • 题目与思路分析
    • 思路一:暴力解法
    • 思路二:快慢指针
  • 代码实现
    • 思路一:暴力解法
    • 思路二:快慢指针
  • 算法代码优化

LeetCode第160题:

github地址

有梦想的电信狗

前言

本文用C++实现LeetCode第160题


题目描述

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


题目与思路分析

目标分析

  1. 给定两个单链表的头节点 headAheadB ,找出并返回两个单链表相交的起始节点

  2. 如果两个链表不存在相交节点,返回 nullptr

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

思路一:暴力解法

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

操作

  • ListNode* curNode1 = headA, *curNode2 = headBcurNode1curNode2分别用于迭代遍历两个链表

  • 链表A中的每个节点需要和链表B中的每个结点进行比较

    •   while(curNode1){while(curNode2){if(curNode1 == curNode2)return curNode1;elsecurNode2 = curNode2->next;}curNode1 = curNode1->next;curNode2 = headB;}
      
    • curNode1 == curNode2时:代表是相交的结点,返回当前结点即可

    • else:内层循环中,curNode2移向下一个节点

  • 内层循环结束一轮后

    • 链表A的curNode1向后移动:curNode1 = curNode1->next
    • 链表B的迭代结点回到链表B的头结点,准备进行下一轮遍历:curNode2 = headB;
  • 循环内没有return时,代表没有相交。循环结束后return nullptr;

  • 时间复杂度O(n^2),空间复杂度O(1)

思路二:快慢指针

思路快慢指针解法

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

操作

  • ListNode* curNode1 = headA, *curNode2 = headBcurNode1curNode2分别用于迭代遍历两个链表

  • 求链表长度的子函数

    •   private:size_t getLength(ListNode* list){ListNode* curNode = list;size_t length = 0;while(curNode){++length;curNode = curNode->next;}return length;}
      
  • 分别求两个链表的长度

    • size_t lengthA = getLength(headA)size_t lengthB = getLength(headB);
  • 比较两个链表的长度,长的链表的curNode指针先移动差距步

  • 再让两个curNode指针同时移动,第一个相同的地址就是交点

  • 时间复杂度O(m + n),空间复杂度O(1)

在这里插入图片描述

代码实现

思路一:暴力解法

  • 暴力解法:时间复杂度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;elsecurNode2 = curNode2->next;}curNode1 = curNode1->next;curNode2 = headB;}return nullptr;}
};

思路二:快慢指针

  • 快慢指针解法:时间复杂度O(m + n),空间复杂度O(1),其中mn分别为两个链表的长度
// 时间复杂度为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;}
};

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀

http://www.dtcms.com/a/490156.html

相关文章:

  • HUAWEI A800I A2 aarch64架构服务器鲲鹏920开启虚拟化功能
  • Java-151 深入浅出 MongoDB 索引详解 性能优化:慢查询分析 索引调优 快速定位并解决慢查询
  • 微信小程序快速入门【02】
  • YOLO-V1 与 YOLO-V2 技术详解:从经典到优化的目标检测演进
  • 天津市网站制作公司百度seo点击器
  • 建设部网站燃气管理部门网络软件开发
  • 三种思路彻底掌握 BST 判断(递归与迭代全解析)——力扣98.验证二叉搜索树
  • 基于k8s环境的mongodb多副本高可用方案
  • 汽车免拆诊断案例 | 2014 款宝马 M4 车冷起动后发动机抖动
  • 横泉水库建设管理局网站鄂州网站建设哪家专业
  • 虚拟人驱动密码:惯性动作捕捉设备+无穿戴动作捕捉技术
  • Linux01
  • StarRocks 数据分析加速:ETL 如何实现实时同步与高效查询
  • 2025年主流开源AI智能体框架平台概览
  • 自己做卖假货网站手机网站
  • 多字节串口收发IP设计(六)串口帧接收模块设计及仿真(含源码)
  • Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
  • 项目实践1—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
  • 源同步接口(六)
  • app 门户网站我在征婚网站认识一个做IT
  • 【FFmpeg】对比 d3d12va 、d3d11va、dxva2 这三种视频硬解方案
  • 苹果iOS开发零基础特训(视频教程)
  • 数字图像相关(DIC)技术在岩石剪切变形测量中的应用研究:全场应变与破坏机制分析
  • 建站工具 开源捷克网站后缀
  • @Resource和@Autowired注入区别
  • 网站设置cookie什么意思以个人名义做地方门户网站
  • 客户案例 | 派克新材x甄知科技,构建全场景智能IT运维体系
  • python基本数据类型、字典、 集合、条件与循环控制、函数(3)
  • 语音处理:wav头格式非44字节场景处理分析
  • git 安全证书 【git】