判断两个链表是否相交:(假设两个链表都没有环)
1、判断第一个链表的每个节点是否在第二个链表中
2、把第二个链表连接到第一个后面,判断得到的链表是否有环,有环则相交
3、先遍历第一个链表,记住最后一个节点,再遍历第二个链表,得到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交

如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)
一种O(n)的办法就是(用两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
bool check(const node* head)

{if(head==NULL) return false;node *low=head, *fast=head->next;while(fast!=NULL && fast->next!=NULL){low=low->next;fast=fast->next->next;if(low==fast) return true;}return false;
}

扩展问题参考:http://hi.baidu.com/azuryy/blog/item/18e85b02ec34a4094bfb51de.html
扩展1:如果链表可能有环,则如何判断两个链表是否相交
思路:链表1 步长为1, 链表2步长为2 ,如果有环且相交则肯定相遇,否则不相交

list1 head: p1
list2 head: p2
while( p1 != p2 && p1 != NULL && p2 != NULL )
{p1 = p1->next;if ( p2->next )p2 = p2->next->next;elsep2 = p2->next;
}
if ( p1 == p2 && p1 && p2) //相交
else //不相交

扩展2:求两个链表相交的第一个节点
思路:在判断是否相交的过程中要分别遍历两个链表,同时记录下各自长度。

Node* step( Node* p, Node* q)
{if ( !p || !q ) return NULL;int pLen = 1;int qLen = 1;bool result = false;while( p->next ){pLen++, p = p->next;}while( q->next ){qLen++, q = q->next;}result = ( p == q );if ( result ){int steps = abs( pLen - qLen);Node* head = pLen > qLen ? p : q;while ( steps ) //对齐处理{head = head->next, steps--;}pLen > qLen ? p = head : q = head;while ( p != q ){p = p->next, q = q->next;}reutrn p;}return NULL;
}

下面转载来源:http://blog.chinaunix.net/u2/63031/showart_1003241.html

深信服一道笔试:如何判断两个单向链表是否有相交,并找出交点。

题比较简单,单向链表有交点意思就是交点后的节点都是一样的了。

NODE* FindNode(NODE* pHead1, NODE* pHead2)
{NODE* p1 = pHead1;NODE* p2 = pHead2;int i = 1, j = 1, k = 0, f = 0;if(pHead2 == NULL || pHead2 == NULL){return NULL;}while(p1->next != NULL){p1 = p1->next;i++;}while(p2->next != NULL){p2 = p2->next;j++;}if(p1 != p2){return NULL;}else{p1 = pHead1;                // 1p2 = pHead2;f = fabs(i, j);if(i > j)                    // 2{for(k=0; k<f; k++){p1 = p1->next;}while(p1 != p2){p1 = p1->next;p2 = p2->next;}return p1;}else{for(k=0; k<f; k++){p2 = p2->next;}while(p1 != p2){p1 = p1->next;p2 = p2->next;}return p1;}}
}

2,小优化。循环和判断,把判断放在外面;如果把i和j大小判断放在里面的话就意味着循环多少次,判断就执行多少次;当然这样做的唯一不足就是代码 多了点;还有for循环之前的对f的赋值,有的为了简便直接放在for语句里面,不过同样道理,放在for循环里面,就执行了n次的fabs;拿出来赋 值,只赋值一次就OK。

【链表】如何判断两个单向链表是否有相交,并找出交点相关推荐

  1. 如何判断两个单向链表是否有相交,并找出交点

    如果两个单向链表相交,一定是形成Y字形,而不会是X字形.基于这个想法,可以判断两链表是否相交. 代码 NODE* FindNode(NODE* pHead1, NODE* pHead2) {      ...

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

    链接:http://www.cnblogs.com/mengdd/archive/2013/03/14/2958642.html 题目来源 <编程之美>3.6节. 给出两个单向链表的头指针 ...

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

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

  4. 判断链表是否相交并找出交点

    问题概述 单链表定义如下: public class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}} 编 ...

  5. neo4j 查询同一节点的两个上级_链表的魅力:两个单向链表的第一个交点

    最近听了左神的算法课,对一些常用数据结构以及算法改进的思路有了更深的理解,特此总结,不定期更新算法题目以及答案总结!笔者使用C++进行算法重现!虽然左神使用的是JAVA,但他自己也说了,算法与语言无关 ...

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

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

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

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

  8. java数组转换成单链表_【转】单向链表(单链表)的Java实现

    最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因 ...

  9. 美团点评_给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。

    给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度. import java.util.*; public class Meituan_4 {public static void ...

最新文章

  1. FreeTextBox的ToolbarButton整理
  2. 【DIY】RGB光立方
  3. 职业中专的计算机综合应用,职业中专计算机教学的思考
  4. Installshield在安装结束时刷新系统
  5. C# ASP.NET MVC HtmlHelper用法大全
  6. JQuery文件上传控件Uploadify文档
  7. python 进阶案例_【python3】while和for的进阶案例
  8. python psutil 进行系统管理 no.2
  9. ElementUI:项目中引入自己的ICON
  10. mysql建三行三列表格_基于另一个表中列的名称在mysql中创建表
  11. python怎么重复程序,如何重复运行python程序
  12. 【FPGA算法加速】FPGA编程开发环境:Vivado安装教程详细说明
  13. 致敬逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
  14. 从一个简单的main方法执行谈谈JVM工作机制
  15. MapProxy的部署与TMS地图服务代理
  16. 基于python的招聘网站分析
  17. 英文简历的写法和模板
  18. 电脑配件 - 如何选择电脑显示屏幕 - 学习/实践
  19. 图解LeetCode——768. 最多能完成排序的块 II(难度:困难)
  20. Android 通过外网IP定位城市

热门文章

  1. c语言中文件rw,bootloader和RO,RW,ZI在ARMC语言中
  2. 小白入门NAS—快速搭建私有云教程系列(一)
  3. SegmentFault 讲堂一周岁:Keep learning
  4. java定义长方体类cuboid_Java实验指导书
  5. mac浏览器Brave软件特点分享
  6. 关闭应用右下角的盾牌图标
  7. SVA(立即断言、并发断言、触发判断)-概述
  8. Flowable Unknown property used in expression: xxx
  9. RS-232(or RS-485)、ch340(or cp2102)的关系
  10. 苹果手机上钉钉云盘在哪里?