剑指offer2之两个链表的第一个公共结点

题目(两个链表的第一个公共结点)

输入两个链表,找出它们的第一个公共结点。

算法分析

两个链表的公共节点,即这个节点为两个链表的交汇点,而其两个链表的公共节点之后的所有节点均相同。那么这两个链表的拓扑形状看起来像一个 Y,那么现在问题就转成了如何找到这个交汇点。

算法思路一

可以利用两个栈分别存储两个链表的节点。然后,对这两个栈,两两出栈比较,并记录当前栈顶节点,比较直到顶底节点不同,停止算法。

算法思路二

对于两个不等长的链表,我们在长度较长的链表上让其工作指针先走两链表长度之差的步子,然后,两个链表的工作指针同时前进,直到遇到第一个公共节点即可。这个方法在前面的求链表是否有环的题目其实也有类似的应用。

算法实现一

算法实现二

复杂度

两个思路由于只对链表线性遍历,所以时间复杂度为O(m+n)。但思路一由于用到了两个栈,因而空间复杂度为O(n+m),而后者为 O(1),因此,算法思路二更优,但前者也是一个很好理解的思路。

参考

[1] <<剑指offer2>>
[2] 牛客网

-------------本文结束感谢您的阅读-------------