判断两个单链表是否有交点并且返回交点的值

求两个单链表的交点 这个面试经常会碰到的题目,判断两个单链表是否相交。个人理解的也不是很深,零零散散的从网上找答案,并把所偶看到的整理了一下,希望对大家有帮助。 判断两个单链表是否相交共有三种情况: 1,两个单链表都没有环。 2,两个单链表中 一个有环,一个没有环。 3,两个链表都有环。 看第一种情况,连个单链表相交,只能是y型相交,不可能是x型相交,理由如下,有两个链表,La,Lb,他们的交点设为p吧,假 阅读详情

一、解决这个问题之前我们需要了解下如何判断一个链表有环?

下面提供二种方法进行实现:

  1. 使用快慢指针,p1为快指针,p2为慢指针,让这两个指针指向链表的头部,让p1每次走一步,p2每次走两步,如果p1和p2相交,则说明这个链表上面有环;否则,p1和p2中任何一个为null,则说明没有环;
  2. 使用set集合,将节点往set集合中添加,如果出现不能往set中添加元素的时候,则说明链表是由环的;

二、 判断两个链表是否有交点,输出交点

这个问题分成两种情况,其一是如果链表中不存在环,其二是链表中存在环。

(1)链表中不存在环

基本方法: 先遍历2个链表,求出链表的长度差x;让长链表先走x,后面使得两链表开始跑动,如果遍历的过程中如果出现相等的节点,则链表是有交点的。

代码:

/**
 * 定义单链表
 */
public class Node {
    private int data;
    private Node next;
    public Node(int data){
        this.data = data;
    }
    public void setData(int data){
        this.data = data;
    }
    public int getData(){
        return data;
    }
    public Node getNext(){
        return next;
    }
    public void setNext(Node next){
        this.next = next;
    }
}
 /**
     *判断单链表是否有环,使用快慢指针算法
     */
    public static boolean isHaveLoop(Node node){
        Node p1 = node;
        Node p2 = node;
        while(p1!=null && p2!=null && p2.getNext()!=null){
            p1 = p1.getNext();
            p2 = p2.getNext().getNext();
            if(p1 == p2)
                break;
        }
        return !(p1==null || p2==null); //只要p1或者p2中存在null,则不存在环
    }
/**
     * 不存在环的时候,1.判断是否有交点 2.返回交点
     * (1)计算出两个链表的长度(2)相同位置起始节点是否有交点 isHasPoint并且返回节点
     */
    public int getLen(Node node){
        int len = 0;
        while(node!=null){
            len++;
            node = node.getNext();
        }
        return len;
    }
    public Node getFirstJoinPoint(Node node1,Node node2){
        int len1 = getLen(node1);
        int len2 = getLen(node2);
        int temp = 0;
        if(len1>len2){
            while(true){
            	if(temp == len1-len2)   //先判断下是否相等
                    break;
                node1 = node1.getNext();
                temp++;
            }
        }else{
            while(true){
            	if(temp == len2-len1)
                    break;
                node2 = node2.getNext();
                temp++;  
            }
        }
        while(null != node1 && null != node2){
            if(node1== node2){
                return node1;
            }
            node1 = node1.getNext();
            node2 = node2.getNext();
        }
        return null;
    }

升级版本:如果现在把其中一个链表的首尾相连接,然后只需要判断这个时候另一个单链表是否有环即可。其中需要进行研究问题是如何计算链表进入环的节点。

快指针的速度是慢指针的2倍,所以当假设慢指针走过的路程是:N=L+a

设环的长度为:roundL,快指针走过的路程是:2N=L+k*roundL+a

化简得:L=(k-1)*roundL+(roundL-a)

也就是说链表头到链表进入环的节点之间的距离=快慢指针交点和链表进入环的节点之间的距离+(k-1)(k-1)个环长。

所以,现在只要重新初始化一个新的头指针p3,快慢指针交点为p1(此时p1=p2),让p1和p3同步,每次一位去遍历链表,相交节点即为环的入口节点。

(2)如果上述两个单链表中都是存在环的

肯定有人认为是否存在其中一个有环,另一个没有环这样的情况,这样的情况只是存在于两个链表没有交叉的时候。如果两个链表存在交互且还有环,那么必须是环位于交叉点之后的公共部分,要么是这个环刚好都和这两个链表有交叉点。下面是代码的实现。

这个部分的代码是包含没有环的情况的,思路是先对链表进行判断,如果没有环,使用上述代码(下面做了些改进),反之使用下面的改进的代码。

import org.junit.Test;

public class Main {
    /**
     * 一个链表入环的初始位置
     * 需要进行推导,详情见分析
     */
    public static Node nodeOfIntoLoop(Node node){
    	 Node p1 = node;
         Node p2 = node;
         Node p3 = node;  //保存头结点
         while(p1!=null && p2!=null){
             p1 = p1.getNext();
             p2 = p2.getNext().getNext();
             if(p1 == p2)
                 break;
         }
        while(p1!=p3){
        	p1 = p1.getNext();
        	p3 = p3.getNext();
        }
    	return p3;
    }
    /**
     * 不存在环的时候,1.判断是否有交点 2.返回交点
     * (1)计算出两个链表的长度(2)相同位置起始节点是否有交点 isHasPoint并且返回节点
     */
    public int getLen(Node start,Node end){
        int len = 0;
        while(start!=end){
            len++;
            start = start.getNext();
        }
        return len;
    }
    
    public Node getFirstJoinPoint(Node node1,Node end1,Node node2,Node end2){
        int len1 = getLen(node1,end1);
        int len2 = getLen(node2,end2);
        int temp = 0;
        if(len1>len2){
            while(true){
            	if(temp == len1-len2)   //先判断下是否相等
                    break;
                node1 = node1.getNext();
                temp++;
            }
        }else{
            while(true){
            	if(temp == len2-len1)
                    break;
                node2 = node2.getNext();
                temp++;  
            }
        }
        if(node1== node2){
            return node1;
        }
        while(end1 != node1 && end2 != node2){
            node1 = node1.getNext();
            node2 = node2.getNext();
            if(node1== node2){
                return node1;
            }
        }
         return null;
    }

    /**
     * 实现如果存在环的情况下,如何判断出两个单链表是否有交点,并且求出交点
     */
    public Node getResult(Node node1,Node node2){
    	Node IntoLoop1 = nodeOfIntoLoop(node1);
    	Node IntoLoop2 = nodeOfIntoLoop(node2);
    	if(null == IntoLoop1 && null == IntoLoop2){ //都没有环
    		return getFirstJoinPoint(node1,null,node2,null);
    	}else if((null == IntoLoop1 && null!=IntoLoop2) ||
    			 (null == IntoLoop2 && null!=IntoLoop1)) {
			return null;
		}else { //两个环中都有交点
			if(IntoLoop1 == IntoLoop2){//交点一样,第一种情况
				return getFirstJoinPoint(node1, IntoLoop1, node2, IntoLoop2);
			}else {
				return null; //这种情况下不算是有交点
			}
		}
    }
   
    @Test
    public void test(){
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);
		Node n4 = new Node(4);
		Node n5 = new Node(5);
		Node n6 = new Node(6);
		Node n7 = new Node(7);
		n1.setNext(n4);
		n2.setNext(n3);
		n3.setNext(n4);
		n4.setNext(n5);
		n5.setNext(n6);
		n6.setNext(n7);
		n7.setNext(n6);
		Main main = new Main();
		System.out.println(main.getResult(n1, n2).getData());
    }
}

上述的测试结果是4.

测试用例使用的链表:

 

参考文献:

[1]https://www.jianshu.com/p/634c147fe2a

别再死记硬背菜单了!用Workbench搞定你的第一个ANSYS结构分析(附模型文件) 本文为零基础用户提供使用ANSYS Workbench完成第一个结构分析的完整指南。通过悬臂梁案例详细讲解从几何导入、材料定义、网格划分到边界条件设置的全流程,帮助初学者快速掌握有限元分析的基本操作,并附赠实用模型文件。 阅读详情

相关推荐

DataGridView 右键菜单复制(公共)

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {

沁心渃水 2831

算法基础~链表~求两个链表的交点(不考虑时间、空间复杂度)

ps:本题中的时间复杂度是O(nlogn),即set集合查找时复杂度是logn,而B链还需要遍历n个复杂度,所以最终复杂度 nlogn;思路:(1) 参考链表A“装”到set 集合中,然后B链表从头到尾依次去与“装”到 set 集合中的每个元素做地址的比较。例如图解A链表的长度明显就是长于B链表的,如果不以其中某一条链表为参照链,则A、B链表不可能相遇!(2)具体代码思路:①遍历A链表,将A中结点对应的指针(地址),插入set集合;② 遍历B链表,将B中结点对应的指针(地址),在set中查找,

m0_66468899的博客 273

MT6771 Android13 背光曲线调试与光感数据校准实战

本文详细介绍了MT6771平台在Android 13系统上进行背光曲线调试与光感数据校准的实战经验。针对高亮度环境下背光误调节问题,深入分析了光感数据上报机制,并提供了驱动层配置修改、背光曲线优化及常见问题解决方案,帮助开发者快速定位并解决类似问题。

moon9的博客 287

求两个链表的交点并输出交点所带的值

#include<iostream> using namespace std; #include<set> struct node {     node(int value = 0):v(value){}     int v;     node *next; }; node *find(node *heada,node *headb) {     set<node*&...

panda_wx的博客 181

激光三角测量法:斜射与直射式技术的原理与应用解析

本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。

weixin_29280219的博客 414

标准化降水指数介绍

Mckee et al.(1993)认为降水量的减少是导致干旱的主要因素,其他气候因子一般变化较小,对干旱产生的影响不大,因此SPI使用降水量作为唯一参数。SPI能较好表达因降水量的大小反映干旱状况,操作简单,所需资料仅为降水量,同时该干旱指数在各个地区和各个时段都具有良好的计算稳定性,是继PDSI之后另一种被广泛应用的干旱指数。𝐻(𝑥)是Γ分布求得的概率,并当𝐻(𝑥)>0.5时,S=1;式中,𝛼是形状参数,𝛽是尺度参数,𝑥是当月降水量,𝛤(𝛼)是Gamma函数,用极大似然估计法计算最佳的𝛼和𝛽,即。

weixin_44259522的博客 2857

如何判断两个链表是否相交并找出交点

解题思路 情况1:两个链表均不含有环 1、直接法 采用暴力的方法,遍历两个链表,判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大。 2、hash计数法 如 果 两个链表相交,则两个链表就会有共同的结点;而结点地址又是结点唯一标识。因而判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一 个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共 同的结点。这个方法

onlymayao的博客 6786

从零构建:Trinamic API在STM32上的深度移植与TMC-IDE通信实战

本文详细介绍了如何从零开始在STM32平台上深度移植Trinamic API,并实现与TMC-IDE工具的稳定通信。内容涵盖SPI底层驱动定制、寄存器配置、高级功能实现及调试技巧,重点解析了TMC5160芯片的集成实践,帮助开发者构建可靠的嵌入式运动控制系统。

w1x2y3的博客 254

判断两个链表是否相交并找出交点,判断一个链表是否有环

链表的分类 链表主要分为三类: 单向链表只能从表头到表尾的顺序,每个节点中保存了指向下一个节点的指针; 双向链表则可以反向遍历,因为节点中既保存了向后节点的指针,又保存了向前节点的指针。 循环链表指的是在单向链表和双向链表的基础上,将两种链表的最后一个结点指向第一个结点从而实现循环。 判断两个链表是否相交并找出交点 问题描述: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。 解...

qichangjian的博客 1879

eMMC数据擦除的方式

接下来主要是讲解erase、trim、discard的差异,涉及的command有CMD35、CMD36、CMD38。一般用来擦除整卡或者某些分区,如果只想擦除一个。以下是device status的部分解释。eMMC的数据擦除方式有6种,分别是。将会跳过写保护,只执行其他的范围。Discard的命令序列是。Erase的命令序列是。的范围有包含写保护,Trim的命令序列是。

DPJimmy的博客 1764

别再死记硬背了!用‘小乌龟’实战图解ROS1核心指令(rosnode/rostopic/rosparam保姆级手册)

本文通过经典的turtlesim乌龟仿真器,以可视化实战方式讲解ROS1核心指令(rosnode/rostopic/rosparam),帮助初学者摆脱死记硬背,在操控乌龟的过程中轻松掌握节点管理、话题通信和参数设置等ROS1核心概念。

weixin_28731223的博客 370

判断两个链表是否相交

判断两个链表是否相交   2012-01-09 10:37:03|  分类: 默认分类 |  标签: |字号大中小 订阅 给出两个单向链表的头指针,判断这两个链表是否相交,如果相交给出相交的第一个结点 一、两个链表均不含有环 链表相交如下图    方法一:直接法    直接判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大 方

DSIslander的专栏 819

1. 如何使用扣子工作流一键生成儿童绘本(可以发到小红书,微信公众号图文等)

本文介绍了使用扣子智能体一键生成儿童绘本的工作流。用户只需输入绘本主题,系统会自动生成Markdown格式内容,可直接发布到优快云、小红书等平台,还支持推送至微信公众号草稿箱。操作步骤包括:访问扣子网站导入工作流源代码,输入主题试运行,查看实时进度和最终输出结果。工作流编辑器会显示每个节点的执行状态和耗时,支持通过"查看日志"功能回溯历史运行记录。文末附有工作流源代码下载链接。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1245

判断两个链表是否相交并找出交点

问题描述: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。 思路: 1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。 2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。 3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部的

疯狂算法~ 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python 判断两个单链表的交点

前言 在前面两章有介绍过单链表的基本操作以及有环链表的相关问题。本章主要分析两个单链表的交点问题。 首先声明,两个单链表只能存在 Y 型交叉,不会存在 X 型交叉。因为如果是 X 型交叉,节点在交叉点之后便不知道 next 指针指向为哪一个节点。 实战分析 判断单链表是否相交存在三种情况: 两个单链表都没有环。 两个单链表中 一个有环,一个没有环。 两个链表都有环。 情况1 ...

Herishwater的博客 1209

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点。 这道题的思路和解法有很多,在这把这道题的解法做一个详细的总结。解这道题之前,我们需要首先明确一个概念: 如果两个单链表有共同的节点,那么从第一个共同节点开始,后面的节点都会重叠,直到链表结束。 因为两个链表中有一个共同节点,则这个节点里的指针域指向的下一个节点地址一样,所以下一个节点也会相交,依次类推。所以,若相

rotation博客 4万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何判断两个链表是否相交?如果相交求交点

问题描述:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。(注意两个单链表相交不会出现X型交叉——单链表,每个节点只有一个指针域)。第一种情况:两个链表均不含有环解题思路:1、直接法:采用暴力的方法,遍历两个链表,判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大;顺序查询到第一个在第二个链表种的节点即是两个链表的交点。2、先遍历第一个链表...

Gandoph的博客 1万+

判断两个单链表是否有交点

问题描述: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。 思路: 1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。 2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。 3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部

shanchangyi的博客 622

判断两个可能有环的链表是否有交点

判断两个可能有环的链表是否有交点两个单链表相交的一系列问题首先需要判断单链表是否有环hashSet(很简单,不多说,空间复杂度O(n))快慢指针接下来就需要解决有无交点的问题:两个无环链表是否有交点:两个有环链表是否有交点(***三种拓扑结构***)完整代码(java) 最近准备面试的时候碰到的一道题,记录一下…… 【问题】:单链表可能有环, 也可能无环。 给定两个 单链表的头节点 head1和head2, 这两个链表可能相交, 也可能 不相交。 请实现一个函数, 如果两个链表相交, 请返回相交的 第一个节

weixin_43578004的博客 618

给定两个单链表,判断是否有交点,如果有则返回第一个交点

算法:得到两条链的长度m和n,再定义两个指针p1和p2,分别指向两条链的开头,如果m>n,则让p1先走m-n步,如果n>m,则让p2先走n-m步,然后两个指针再一起走,相遇的第一个点就是第一个交点,若不相遇则没有交点。(两个链表都无环) (相交的特征:只要两条链表相交,则从第一个交点开始后面的节点都相交) 注:还要就链表是否有环的情况进行分类讨论。 (1)如果一个有环一个无环则肯定不相交 (2)都有环但是两个链表不相交 (3)都有环且相交 有环情况...

m0_47560114的博客 457

JAVA-判断两个单链表是否相交并求交点

文章目录1.两个链表都不存在环2.两个链表均存在环 在上一篇文档中,通过java实现了单链表反转的问题,之后发现一个更有意思的问题就是如何判断两个链表是否相交?如果相交,则需要得到交点。 对于这个问题,需要分别考虑链表上是否存在环的情况。 //链表节点 public class DataNode { private int data; private DataNode next; public int getData() { return data; } public void setD

dhaibo1986的专栏 1711

java如何判断链表是否为空_JAVA 判断两个单链表是否相交并求交点

在上一篇文档中,通过java实现了单链表反转的问题,之后发现一个更有意思的问题就是如何判断两个链表是否相交?如果相交,则需要得到交点。对于这个问题,需要分别考虑链表上是否存在环的情况。//链表节点public class DataNode {private int data;private DataNode next;public int getData() {return data;}publi...

weixin_36288711的博客 758

java 判断两个单链表是否相交?并找出第一个交点

题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点。 这道题的思路和解法有很多,在这把这道题的解法做一个详细的总结。 解这道题之前,我们需要首先明确一个概念: 如果两个单链表有共同的节点,那么从第一个共同节点开始,后面的节点都会重叠,直到链表结束。 因为两个链表中有一个共同节点,则这个节点里的指针域指向的下一个节点地址一样,所以下一个节点也会相交,依次类推。所...

wutengfei_java的博客 1204

判断两个单链表是否相交?若相交求交点?(单链表无环)

怎样判断单链表是否相交?   如果两个链表相交,则两个链表就会有相同的结点。    方法1. 依次判断第一个链表中的结点是否都在第二个链表中。    方法2. 若两个单链表相交,则从交点之后的链表结点内容是一样的,即两个单链表最后一个结点一定是相同的,我们可以遍历两个结点,判断最后一个元素地址是否相同。    方法3.构环,将L2的最后一个结点指向L2的头结点,构成环,判断L1链表是否有...

zhao_miao的博客 1192

【链表】判断两个单链表是否相交+找到第一个交点|判断两个链表是否有环

原文;https://blog.youkuaiyun.com/fengxinlinux/article/details/78885764 题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点。 这道题的思路和解法有很多,在这把这道题的解法做一个详细的总结。 解这道题之前,我们需要首先明确一个概念: 如果两个单链表有共同的节点,那么从第...

小鱼菜鸟的博客 258

判断两个链表是否相交,若相交,求交点。

首先我们来看一下单链表: 第一种情况:两个链表均不带环 判断两个不带环的链表是否相交,如果两个链表相交的话可如下图所示: 判断是否相交:由上图可知,如果两个不带环链表相交的话这两个不带坏链表的尾节点地址一定相同,所以我们只要各自遍历两个链表,判断其尾节点地址是否相同,如果相同则相交,否则不相交。 typedef struct SListNode { DataType data...

ty6693的博客 472
上一篇: 淘宝智能新制造java后端面经
下一篇: ArrayList为什么会出现并发问题以及相应的解决办法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值