剑指 Offer 52. 两个链表的第一个公共节点

本文探讨了寻找两个链表交点的不同策略,包括使用哈希表、双指针同步前进等方法。分析了各种方法的时间复杂度和空间复杂度,并给出了代码实现及运行结果,揭示了在实际应用中可能遇到的性能挑战。
摘要由CSDN通过智能技术生成

剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode) (leetcode-cn.com)

目录

思路分析

方案1

方案2

理论上的最优解法

代码

运行结果

实际上的最优解法

代码

运行结果

 注


思路分析

设第一个链表有M个节点,第二个链表有N个节点。

方案1

看到这题,第一想法是倒着来,因为两个链表后面必定是重合的。但是链表是单链表,没法反向迭代,除非放到顺序容器里,比如放到两个数组里,或者两个栈里,然后反向迭代。

这样操作的话,时间复杂度是O(max(M, N)),空间复杂度是O(M + N)。

方案2

仔细一想,其实方案1是有多余的开销的:把两个链表放进数组的时候就已经把最后一段公共部分遍历了两遍了;然后从后向前排查两个数组,相当于又把公共部分遍历了两遍,这样算下来,公共部分其实算是遍历了四遍。

一个比较合理的想法是把两个链表所有的节点只遍历一遍,最后一段公共部分也只遍历一遍。

可以考虑遍历第一个链表的时候对每个节点做标记,这样遍历第二个链表的时候找到第一个有标记的节点就行了。做标记就是把节点指针和一个int/char/bool类型的变量关联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值