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

相交链表~

题目描述

给你两个单链表的头节点 headAheadB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。图示两个链表在节点 c1 开始相交

题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构 。

解题思路

暴力求解

在A链表中遍历每一个结点,去B链表中依次找一遍,但是这种方法的时间复杂度为O(N^2),因此,这种方法想必不太好,就不写代码实现了。

优雅解法

我们可能会这样想,如果在交点前同样距离远的位置同时开始遍历两个链表,那么在接下来的遍历过程中肯定会遍历到同一个结点,当第一次遍历到同一个结点时,那么这个结点就必然是交点。那么问题来了,我们刚才的假设是在交点前同样距离远的位置同时开始遍历两个链表,那么怎么才能做到这样呢?这两个链表的长度很可能是不一样的。我们这样想,分别遍历A、B这两个链表,同时计算这两个链表的长度,如果最终遍历到同一个结点,那么这两个链表必然相交,因此我们也可以计算出这两个链表长度的差值(假设为dif)。得到的这个差值很关键,我们让较长的链表先开始走dif步,然后两个链表再同时继续遍历,当遍历到同一个结点时,这个结点就是交点。

实现代码如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* curA=headA;struct ListNode* curB=headB;int sizeA=1;int sizeB=1;while(curA->next){curA=curA->next;sizeA++;}while(curB->next){curB=curB->next;sizeB++;}//判断相交if(curA != curB)return NULL;int dif=abs(sizeA-sizeB);curA=headA;curB=headB;//长的先走dif步if(sizeA > sizeB){while(dif--){curA=curA->next;}}else{while(dif--){curB=curB->next;}}//一起走while(curA != curB){curA=curA->next;curB=curB->next;}return curA;  
}

http://www.lryc.cn/news/223461.html

相关文章:

  • 跨境电商API接口如何通过API数据接口进行选品
  • ArrayList集合方法(自写)
  • sql注入学习笔记
  • 企业涉密文件怎么加密?企业重要文件加密方法
  • 经典猜数游戏(python类封装)
  • 环形链表~
  • GZ038 物联网应用开发赛题第1套
  • SQL关键字
  • 第三章:人工智能深度学习教程-基础神经网络(第五节-了解多层前馈网络)
  • 如何实现Debian工控电脑USB接口安全管控
  • 开源知识库软件xwiki在Windows下的安装
  • 学习c#的第一天
  • 机器学习实战——《跟着迪哥学Python数据分析与机器学习实战》
  • 开源的全能维护 U 盘工具:Ventoy
  • Redis7学习笔记01
  • Redis的持久化机制和配置
  • 【IP固定】地平线开发板如何实现重启IP地址不变
  • CHATGPT----自然辩证法分析
  • Python测试框架之pytest快速入门
  • CSS 动画特效运用目录
  • css文本溢出省略号点点点
  • MSSQL 配置ORACLE ​链接服务器
  • HiSilicon352 android9.0 适配红外遥控器
  • 0004Java安卓程序设计-springboot基于APP的鲜花商城
  • 对Axios进行封装
  • Python TCP服务端多线程接收RFID网络读卡器上传数据
  • Ubuntu22.04安装MySql
  • 设计模式-桥接模式(Bridge)
  • 库存预占架构升级方案设计-交易库存中心
  • 【redis】ssm项目整合redis,redis注解式缓存及应用场景,redis的击穿、穿透、雪崩的解决方案