1.判断一个链表是否相交,若相交,求交点(假设链表带环)

2.具体思路如下图所示

既然已经分析清楚,那么代码就很好实现了.

Node* IsHaveCrossNode(Node* head1,Node* head2){assert(head1);assert(head2);Node* meetNode1 = IsCircle(head1);Node* meetNode2 = IsCircle(head2);//排除第1种情况if (meetNode1 == NULL || meetNode2 == NULL){return NULL;}//说明两个链表都带环//根据相遇点排除第2种情况Node* cur1 = meetNode1->_next;while (cur1 != meetNode1 && cur1 != meetNode2){cur1 = cur1->_next;}if (cur1 != meetNode2){return NULL;}//区分第3和第4种情况(需要求出两个入口点)Node* entry1 = GetEntryNode(head1, meetNode1);Node* entry2 = GetEntryNode(head2, meetNode2);//第3种情况(转化为求两个链表的交点,链表不带环时)if (entry1 == entry2){entry1->_next = NULL;entry2->_next = NULL;Node* meet = IsMeet(head1, head2);return meet;}//第4种情况(有两个入口点,返回一个即可)return entry1;}
内部调用的函数如下:
   //判断一个链表是否带环//思路:快慢指针,返回相遇点Node* IsCircle(Node* head){if (head == NULL){return NULL;}Node* pFast = head;Node* pSlow = head;//快指针一次走两步,慢指针一次走一步while (pFast && pFast->_next){pFast = pFast->_next->_next;pSlow = pSlow->_next;if (pFast == pSlow){break;}}if (pFast && pFast->_next){return pFast;}return NULL;}Node* GetEntryNode(Node* head, Node* meetNode){assert(head && meetNode);Node* p1 = head;Node* p2 = meetNode;while (p1 != p2){p1 = p1->_next;p2 = p2->_next;}return p1;}//判断是否相交,判断尾节点//若相交,则返回交点Node* IsMeet(Node* head1,Node* head2){assert(head1 && head2);Node* cur1 = head1;int count1 = 0;Node* cur2 = head2;int count2 = 0;while (cur1->_next){++count1;cur1 = cur1->_next;}while (cur2->_next){count2++;cur2 = cur2->_next;}if (cur1 != cur2){return NULL;//说明没有交点}int D_val = count2 - count1;if (D_val < 0){D_val = -D_val;}//cur1 = head1;cur2 = head2;if (count1 < count2){//让head2链表先走D_val长度while (cur2 && D_val--){cur2 = cur2->_next;}while (cur2 && cur1 != cur2){cur1 = cur1->_next;cur2 = cur2->_next;}if (cur1 == cur2){return cur1;}}else{//让head1链表先走D_val长度while (cur1 && D_val--){cur1 = cur1->_next;}while (cur1 && cur1 != cur2){cur1 = cur1->_next;cur2 = cur2->_next;}if (cur1 == cur2){return cur1;}}return NULL;}

C++判断两个链表是否相交算法相关推荐

  1. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  2. 3.6 判断两个链表是否相交

    判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...

  3. 判断两个链表是否相交

    方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...

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

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

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

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

  6. 如何判断两个链表是否相交并求出相交点

    排除链表存在环的情况 此情况的意思就是普通的单链表是否相交问题. 相交是什么意思?注意不是单纯的节点的数值域相等,相交的意思是两个链表的部门节点的是同一个,就是这些节点为这两个链表共有. 链表的定义参 ...

  7. 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】(C语言)

    int IsListCroseWithCycle(PSListNode pL1, PSListNode pL2) {PSListNode pMeetNode1 = HasCycle(pL1);PSLi ...

  8. 编程之美-判断两个链表是否相交方法整理

    [试题描述] 记 N = length(h1) M = length(h2) 方法一:暴力搜索,时间复杂度为O(N*M) 方法二:时间复杂度为O(N+M) 方法三: 方法四:时间复杂度为O(N+M) ...

  9. 判断单链表是否存在环以及两个链表是否相交

    有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.如下图: 图1 有环的链表 问题:如何判断一个链表是不是这类链表?如果链表为存在环,如何 ...

最新文章

  1. CUDA下在Host端分配的几种内存模式
  2. 第一章:渗透测试之信息搜集
  3. 译注(3): NULL-计算机科学上最糟糕的失误
  4. IBM希望其“裁剪”过的Swift能够引诱你使用BlueMix云
  5. linux-查看文件类型-看本质-file
  6. tensorboard 1.14.0 has requirement setuptools>=41.0.0, but you‘ll have setuptools 40.2.0
  7. JavaScript判断数组是否有重复值
  8. 手把手教你从0-1做一张酷炫驾驶舱,让老板对你赞不绝口
  9. 去掉CSDN blog 多余的版权申明部分[转贴]
  10. 什么是句柄,句柄有什么作用
  11. android中图标怎么改,android的软件图标怎么改
  12. 怎样给图片降噪?这几个图片降噪软件可以帮助你
  13. ARMv7和ARMv8架构比较
  14. module github.com/jinzhu/gorm/dialects/mysql: git ls-remote -q origin in E:\go_gin\pkg\mod\cache\vcs
  15. 用于冗余音频数据的RTP负载格式(RFC2198)
  16. matlab中的addemup是什么,毕业论文-rsa密码体制的设计及matlab语言下的实现
  17. frp-内网穿透-远程桌面
  18. 10月2号陪同学买笔记本的经历
  19. 【第21天】SQL进阶-查询优化- performance_schema系列三:事件记录(SQL 小虚竹)
  20. Handler.obtainMessage()的认识和理解

热门文章

  1. java: 程序包com.zyt.hm.VO不存在
  2. Android移动拼图小游戏
  3. python兔子繁殖问题
  4. java我的世界填充方块,我的世界怎么快速填充方块-快速填充方块攻略
  5. 二进制安装habor
  6. apscheduler使用中的时区问题
  7. win10如何截屏_Win10的10个神仙级自带工具
  8. 数字图像处理 - Ch3 锐化(高通)空间滤波器
  9. CSS-----颜色值的缩写和字体的缩写方法
  10. fx5u模拟量如何读取_三菱FX5U PLC内置模拟量输入为电流怎么设置?