本博客主要记录两个解法:
1.求两个单链表的节点个数,消除结点个数不同带来的影响,两个指针一起走,相遇即相交点。
2.数学方式求解。

一、求结点个数,消除结点个数不同带来的影响,俩指针同步走

思路:两个单链表相从相交的第一个结点开始,后面的结点都共享,所以两个单链表的节点个数之差就是相交的结点之前,两个单链表的结点个数之差,我们只需要将两个单链表结点个数之差算出来,然后消除结点个数不同带来的影响,让p1和p2同时向后走,那么相遇的时候,即相交的第一个结点,如下图:

p1和p2分别从两个单链表的如下位置同时向后走,那么p1和p2相遇时的结点即为相交的第一个节点(如果不相交,那么p1和p2最终都会指向NULL)

代码:

//不相交,返回NULL,相交返回第一个相交的结点
ListNode* FindTheSameNode(ListNode* head1, ListNode* head2)
{if (head1 == NULL || head2 == NULL)//两个单链表都是空的{return NULL;}ListNode* p1 = head1;int num1 = 0;//记录第一个单链表的节点个数ListNode* p2 = head2;int num2 = 0;//记录第二个单链表的结点个数while (p1 != NULL)//计算第一个单链表的节点个数{++num1;p1 = p1->next;}while (p2 != NULL)//计算第二个单链表的节点个数{++num2;p2 = p2->next;}p1 = head1;p2 = head2;//让p1或者p2把节点个数的差值的影响去除while (num1 > num2){p1 = p1->next; num1--;}while (num2 > num1){p2 = p2->next;num2--;}while (p1 != p2)//如果相交,则退出时p1 == p2,指向"相交的第一个结点",如果不相交,则最后p1 == p2 == NULL{p1 = p1->next;p2 = p2->next;}return p1;
}

二、数学思维

思路:
如下图,假设相交的结点之前第一个单链表的结点个数为a,第二个结点个数为b,相交部分结点个数为c
那么p1(==head1)走完整个单链表,走的距离为:a+c
那么p2(==head2)走完整个单链表,走的距离为:b+c
如果我们让p1走单链表的尾之后,从head2继续向后走,p2走到单链表的尾之后从head1继续向后走,那么最后p1和p2到相交的第一个结点一定相遇,因为它们俩这个时候走的总距离都为a+b+c+1,一起走的,所以p1和p2在单链表相交的第一个结点的位置一定相遇。如果单链表没有相交,那么最后p1和p2都会指向NULL。

代码:

ListNode* FindTheSameNode(ListNode* head1, ListNode* head2)
{if (head1 == NULL || head2 == NULL){return NULL;}ListNode* p1 = head1;ListNode* p2 = head2;while (p1 != p2){p1 = p1 == NULL ? head2 : p1->next;p2 = p2 == NULL ? head1 : p2->next;}return p1;//如果head1和head2相交,则p1(p2)为第一个相交的结点,如果不相交,那么p1 == p2 == NULL
}

单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点相关推荐

  1. java比较复数是否相等_通过重载运算符“= =”,实现判断两个复数是否相等的运算(若相等返回1,否则返回0)。重载前置“++”运算符,使虚部和实部分别加1。...

    [单选题]该零件视图中,基本视图的个数为 [单选题]急性肾衰竭少尿或无尿期,需紧急处理的为: [判断题]图中尺寸Φ 的基本偏差是上极限偏差. [多选题]下列物质是极性化合物的是 [判断题]图中尺寸标注 ...

  2. SQL 判断两个时间段是否有交叉

    费话不说,直接上代码 SQL 代码: View Code IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo ...

  3. 7_2判断两个单链表是否相交,若相交,求出第一个交点

    转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己 ...

  4. c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...

    如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...

  5. 判断两个单链表是否相交及找到第一个交点

    题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点.  这道题的思路和解法有很多,在这把这道题的解法做一个详细的总结. 解这道题之前,我们需要首先明确一个概念:  如果两个 ...

  6. 判断单链表是否存在环,判断两个链表是否相交问题详解(转)

    转自:http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表 ...

  7. (不带头结点的)单链表增删查改,逆置单链表(两种方法),求两个单链表的第一个公共结点,合并两个单链表,单循环链表中判断第一个入环点,约瑟夫环

    补充了每个算法的基本思想,并且画了思路图,源代码都经过调试成功 1.SlistNode.c文件 (1) (不带头结点的)单链表增删查改 #include "SlistNode.h" ...

  8. ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)

    1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...

  9. 数据结构 - 如何判断两个无环单链表是否相交;如果相交,给出相交的第一个结点

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 比较好的 ...

最新文章

  1. 图解Redis事务机制
  2. 怎样构建中文文本标注工具?(附工具、代码、论文等资源)
  3. vmware nat模式原理探究,实现虚拟机跨网段管理
  4. Android布局之weight属性解析
  5. CentOS与RedHat的关系
  6. Hibernate 拦截器的使用--动态表名
  7. Hive的安装【完整版】
  8. windows 下安装rabbitmq
  9. 射电天文谱线接收机和终端系统
  10. 稳定币兑换器Orbits发布路线图,包括发行治理代币ORB等
  11. Access安全性之QA详解
  12. 解决IOS引入H5页面Safari浏览器工具栏会遮挡页面底部展示
  13. Parallel ScavengeGC收集器
  14. 实验吧——安全杂项之“A记录”详解
  15. MCP2515 (2)
  16. 点线面平面设计的概念是什么,分享点线结合构成设计图
  17. 【转】基金入门:如何买基金?
  18. 关于我——人工智能专业大二的一年
  19. jar包是干什么用的
  20. 安装Linux详细教程

热门文章

  1. 兴趣记忆法(1)顺口溜记忆
  2. sylog mysql_25.2 配置使用基于mysql存储日志信息
  3. MFC 列表控件CListCtrl加载类似QQ界面的头像与文字
  4. 牛人的博客(机器学习,图像处理,计算机视觉)
  5. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - G. 日期问题
  6. LeetCode Algorithm 240. 搜索二维矩阵 II
  7. 中国大学MOOC 计算机组成原理第4章 测试(中)
  8. Jenkins 基本概念与简介
  9. php另一个php的变量,php - PHP:如何更改依赖于另一个变量的变量? (新手资料) - SO中文参考 - www.soinside.com...
  10. python运行方式特点_编程必修课:一文弄懂python的运行机制