剑指offer--37两个单链表的第一个公共节点

本文介绍了三种寻找两个链表第一个公共节点的方法:暴力匹配、使用栈和最优解法。最优解法首先计算两个链表的长度差,再让长链表先走长度差步,之后两链表同时前进直至遇到第一个公共节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

有两个链表,从链表中的某个节点开始往后的其他节点都是重复的,形成一个如下Y字型的结构:


通过观察我们可以看到:从7开始往后的所有节点都是两个链表中的公共节点,因此7就是我们想要找的第一个公共节点。接下来我给出一些解题思路:

思路一:

对第一个链表中得任何一个节点,我都去从头开始扫描一遍第二个链表中的每一个节点看是不是公共节点,如果是就返回;如果不是继续链表一中的下一个节点。

这个过程对head1中的每一个节点,都要扫描一下head2,时间复杂度为O(m*n);其中m、n分别为两个链表的长度。

思路二:

借助于两个栈,将从头开始将head1链表中的每个节点入栈;从头开始将head2链表中国的每一个节点入栈;这样处理后,两个链表的公共节点都放在栈的上面,接下来如果两个栈栈顶元素相同的话分别对两个栈出栈,最后一个相同的元素就是我们要找的第一个公共节点。




出栈一个栈顶元素后:




出栈栈顶元素8后:



出栈栈顶元素7后:


此时两个栈顶元素都不相同,那么可知7是两个链表的第一个公共节点。

时间复杂度为O(m+n),需要借助于额外的两个栈。


思路三:(效率最高)

首先,从头到尾扫描一下两个链表,计算较长的比短的多出来k个节点;

然后,先从较长的链表出发走k步,然后在两个链表同时向前走,可以获得两个链表的第一个公共节点;

过程:

首先分别扫描两个链表,可知head1长为7,head2长为5,显然head1比head2多出来两个节点。那么head1先移动到第三个节点:


然后两个指针同时先后移动,找到第一个公共节点就停止:


时间复杂度为:O(m+n),不需要额外的辅助空间。

效率最高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值