两链表的第一个公共结点(比较两个链表节点是否相同时比较不了啊,该题尚未完成)

算法题5 找出两个链表的第一个公共结点 题目:两个单向链表,找出它们的第一个公共结点。 链表的结点定义为: struct ListNode {       int       m_nKey;       ListNode*   m_pNext; }; 分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。 如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的 阅读详情

题目:两个单向链表,找出它们的第一个公共结点。

链表的结点定义为:

struct ListNode

{

      int         m_nKey;

      ListNode*   m_pNext;

};

分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。

如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pNext都指向同一个结点。但由于是单向链表的结点,每个结点只有一个m_pNext,因此从第一个公共结点开始,之后它们所有结点都是重合的,不可能再出现分叉。所以,两个有公共结点而部分重合的链表,拓扑形状看起来像一个Y,而不可能像X。

看到这个题目,第一反应就是蛮力法:在第一链表上顺序遍历每个结点。每遍历一个结点的时候,在第二个链表上顺序遍历每个结点。如果此时两个链表上的结点是一样的,说明此时两个链表重合,于是找到了它们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然,该方法的时间复杂度为O(mn)。

接下来我们试着去寻找一个线性时间复杂度的算法。我们先把问题简化:如何判断两个单向链表有没有公共结点?前面已经提到,如果两个链表有一个公共结点,那么该公共结点之后的所有结点都是重合的。那么,它们的最后一个结点必然是重合的。因此,我们判断两个链表是不是有重合的部分,只要分别遍历两个链表到最后一个结点。如果两个尾结点是一样的,说明它们用重合;否则两个链表没有公共的结点。

在上面的思路中,顺序遍历两个链表到尾结点的时候,我们不能保证在两个链表上同时到达尾结点。这是因为两个链表不一定长度一样。但如果假设一个链表比另一个长l个结点,我们先在长的链表上遍历l个结点,之后再同步遍历,这个时候我们就能保证同时到达最后一个结点了。由于两个链表从第一个公共结点考试到链表的尾结点,这一部分是重合的。因此,它们肯定也是同时到达第一公共结点的。于是在遍历中,第一个相同的结点就是第一个公共的结点。

在这个思路中,我们先要分别遍历两个链表得到它们的长度,并求出两个长度之差。在长的链表上先遍历若干次之后,再同步遍历两个链表,知道找到相同的结点,或者一直到链表结束。此时,如果第一个链表的长度为m,第二个链表的长度为n,该方法的时间复杂度为O(m+n)。

什么样的两个链表节点才算是相等呢,为什么不论我用plongnode.equals(pshortnode)还是用plongnode==pshortnode,结果都不对呢,还是初始化两个链表时候就错了捏?help.....

public class Test_35 {
	public static void main(String[] args) {
		int[] arr1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		int[] arr2 = { 10, 11, 12, 4, 5, 6, 7, 8, 9 };
		SignList list1 = new SignList();
		SignList list2 = new SignList();
		for (int i = 0; i < arr1.length; i++) {
			// Node newnode = new Node(arr1[i],null);
			list1.add(arr1[i]);
		}
		for (int i = 0; i < arr2.length; i++) {
			// Node newnode = new Node(arr1[i],null);
			list2.add(arr2[i]);
		}
		Node commonnode = findFirstComonNode(list1.getHead(), list2.getHead());
		System.out.println(commonnode.getData());
	}

	public static Node findFirstComonNode(Node head1, Node head2) {
		if (head1 == null || head2 == null) {
			System.out.println();
			return null;
		}
		int len1 = getlenOfList(head1);
		int len2 = getlenOfList(head2);
		int lendif = 0;
		Node firstcommonnode = null;
		Node plongnode = null;
		Node pshortnode = null;
		if (len1 > len2) {
			plongnode = head1;
			pshortnode = head2;
			lendif = len1 - len2;
		} else {
			plongnode = head2;
			pshortnode = head1;
			lendif = len2 - len1;
		}
		for (int i = 0; i < lendif; i++) {
			plongnode = plongnode.getNext();
		}
		while (plongnode != null && pshortnode != null
				&& (!plongnode.equals(pshortnode))) {
			plongnode = plongnode.getNext();
			pshortnode = pshortnode.getNext();
		}
		if (plongnode == pshortnode)
			firstcommonnode = plongnode;
		return firstcommonnode;
	}

	public static int getlenOfList(Node head) {
		if (head == null) {
			System.out.println();
			return 0;
		}
		int len = 0;
		Node pnode = head;
		while (pnode != null) {
			len++;
			pnode = pnode.getNext();
		}
		return len;
	}

}

class Node {
	private int data;
	private Node next;

	public Node(int data, Node next) {
		this.data = data;
		this.next = next;
	}

	public int getData() {
		return data;
	}

	public void setData(int data) {
		this.data = data;
	}

	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}

	
}

class SignList {
	private Node head;
	private Node tail;
	private int size;

	public Node getHead() {
		return head;
	}

	public void setHead(Node head) {
		this.head = head;
	}

	public Node getTail() {
		return tail;
	}

	public void setTail(Node tail) {
		this.tail = tail;
	}

	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}

	public void add(int i) {
		Node newnode = new Node(i, null);
		if (head == null) {
			head = newnode;
			tail = newnode;
			size++;
		} else {
			tail.setNext(newnode);
			tail = newnode;
			size++;
		}

	}
}


 

c程序有问题,结果就不上传了

 

输入两个链表,找出它们的第一个公共结点 问题描述:输入两个链表,找出它们的第一个公共结点。 阅读详情

相关推荐

(Java 剑指 offer)两个链表的第一个公共结点

文章目录一、题目二、题解 一、题目 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 二、题解 这里的公共结点,其实可以理解为交叉点,也就是如果存在公共结点,则两个链表一定存在公共尾部,因为它们是单链表,交叉点之后的一定是公共尾部。 主要思路就是先让长的链表走两个链表的长度差,然后再一起走,依次判断, class ListNode { int val; ListNode next = null; Li

南淮北安的博客 624

找出两个链表的第一个公共结点

<br />题目:两个单向链表,找出它们的第一个公共结点。<br />链表的结点定义为:<br />structListNode<br />{<br />      int       m_nKey ;<br />      ListNode *   m_pNext ;<br />};<br />分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。<br />如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pNext都指向同一个

liziyun537的专栏 3021

小样本物体检测

Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector 关键:提出了一个小样本数据集:数据集 步骤: 提取support img为一过滤特征 使用support img的特征来过滤query img,最后将过滤后的特征输入RPN网络中 RPN网络层的输出,会进行多头判断,使用全局信息检测,使用局部信息检测,一对多检测 Attention-Based Region Proposal Network Increme

qq_21157073的博客 5266

链表篇: 04-寻找两个链表的第一个公共结点

第二种方案是,需要两个指针 p1,p2 先去让p1 遍历 pHead1,让 p2遍历 pHead2,当p1遍历完毕之后重新遍历pHead2,反之 p2 则取遍历 pHead1 然后,当两个遍历再某个节点时,遇到了相同的值,那么后续的节点就是链表的相同部分。从题目中可以看到,两个链表有长度差,这里可以先让长度比较长的链表先把长度差走完,这里假设为 pHead1, 先让 pHead1 把长度差走完,之后让两个链表同时往后进行遍历,最后当两个链表的值相等时,就直接返回。公共部分部分的长度是 z。

caomnnnnnn的博客 566

[运动规划算法]基于飞行走廊的轨迹优化

文章目录简介一、介绍二、原理飞行走廊生成三、项目演示参考 简介 Btraj是一个在线的四旋翼无人机的运动规划框架,主要用于未知环境中的自主导航。基于机载状态估计和环境感知,采用基于快速行进(FM *)的路径搜索方法,从基于构建的欧氏距离场(ESDF)中寻找路径,以实现更好的时间分配。通过对环境进行膨胀生成四旋翼无人机的飞行飞行走廊。使用伯恩斯坦多项式将轨迹表示为分段Bezier曲线,并将整个轨迹生成问题转换成凸问题。通过使用Bezier曲线,可以确保轨迹的安全性和高阶动力学可行性,可以将轨迹完全限制在安全

xiewf的博客 8063

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题

本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。

weixin_29197051的博客 491

第一关|链表经典问题之第一个公共节点

输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点 c1 开始相交。

weixin_52357120的博客 151

《UDS协议从入门到精通》系列——图解0x22:通过ID读数据

如何向车辆ECU通过DID写入数据?有哪些注意事项?图解+示例带你快速上手0x22服务!!

车载系统攻城狮 8713

两个链表的公共结点

题目 分析 思考这样一个过程: 首先,两个链表可以看成两段路程 定义两个指针,两个指针的速度相同,每次只移动一个单位,如果某个指针跑完了其对应的多路程,那么把它移动到另外一个路程的起始点继续开始 经过上述过程,我们知道最后两个指针是同时到达终点,因为其总的路程相同,速度相同,那么其第一次相遇的点就是链表的入口节点。 代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) {

F13253524870的博客 241

RK3576 USB3.0 DWC3控制器调试:PHY初始化失败排查指南

DWC3 是 Synopsys 公司推出的 USB3.0/3.1 控制器 IP,支持双角色(DRD)模式,可配置为 Host、Device 或 OTG。

小灰灰的博客 1181

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

两个链表的第一个公共结点-链表专题

两个链表的第一个公共结点的四种思路!!

m0_56642224的博客 1443

LDRA Testbed软件静态分析_操作指南

从本文起,将开始LDRA Testbed(TBrun)教程的系列文章,包括软件静态分析、单元测试、集成测试,以及基于Testbed的自动化工具开发、持续集成、常见问题解答等。LDRA公司是专业的软件测试工具与测试技术、咨询服务提供者,其总部位于英国利物浦。其旗舰产品Testbed/TBrun功能全面、易于使用,不仅适合于主机平台软件测试,同时适合于嵌入式软件测试。不仅能进行软件静态测试,还能进行软件单元测试、软件集成测试,在白盒测试领域运用比较广泛。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1万+

牛客刷题-面试笔刷TOP101-5 两个链表的第一个公共结点

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)数据范围: n≤1000要求:空间复杂度 O(1),时间复杂度 O(n)例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。

cfqgdcjdx的博客 1672

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

牛客题解 | 两个链表的第一个公共结点

牛客题库题解

wc529065的博客 1178

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

两个链表的第一个公共结点

两个链表的第一个公共结点 题目 输入两个链表,找出它们的第一个公共结点。 示例 示例 1: 1, 2, 3, 4, 5, 6, 7, 8, 9 10,11, 4, 5, 6, 7, 8, 9 返回4 解题 思路 两个链表定义两个指针指向头节点,然后同时一步一步指向next,当next为null时,分别指向对方的头结点。 直到指针指向的引用为同一个对象就是所求, 因为两个相交链表只有相交点前面的长度...

程序员大航子 1754

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python 两个链表的第一个公共结点

''' 题目描述 输入两个链表,找出它们的第一个公共结点。 思路一: 先求出每个链表的长度,分别为a+n和b+n n表示两个链表公共部分的长度,从第一个公共节点向后的每个节点都是两个链表的公共节点 也就是说从第一个相同的公共节点往后的所有节点都相同 用指针1和指针2分别记录两个列表中当前感兴趣的位置索引值 则如果a>b,相当于让指针1比指针2多走a-b步,则找到第一个两个指针所指向的内容相...

WYXHAHAHA123的博客 522

算法练习-第五天(两个链表的第一个公共结点)

两个链表的第一个公共结点

真正的大师永远怀着一颗学徒的心 756

两个链表的第一个公共结点 java

题目:输入两个链表,找出它们的第一个公共结点。 面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第一链表上顺序遍历每个结点,没遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,于是就找到了他们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然该方法的时间复杂度为O(mn). 通

samjustin的博客 2228

剑指offer-两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点。 思路 首先要理解公共结点的含义,不是说两个节点所对应的val相等,而是说第一个公共点之后的next都是一样的,所以他们必然有公共的尾部。而题目中已经告诉了,两个链表必有公共结点,所以有以下解法: //方法一:运用HasnMap的特性 import java.util.HashMap; public class Solution { pu...

渴望飞翔的猪 256
上一篇: 在字符串中删除特定的字符
下一篇: 求一个数的阶乘
tanyujing
博客等级 码龄18年 135粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值