参考编程之美的第三章 234页。
如果离链表有环的话,有环的节点肯定是共同的节点,通过标志位找环的节点或者通过链长度n以及循环的第n+1个节点肯定是第一个节点,然后用这个节点在第二个链中去遍历。
剑指offer上的193页,面试题37
方法2:标记已经访问的节点
首先对每个节点添加一个标志位bVisited,表示这个节点有没有被访问过,初始为false。
然后遍历链表A,把A中的每个节点标识为已访问过(设置bVisited=true);然后遍历链表B,在遍历的过程中,如果发现有一个已经访问过的节点,则证明此节点为A和B的交点。
这个算法的复杂度是O(m+n),比方法1好,但是这个方法需要为每个节点添加一个标志位。一种变通的方法是,利用Hash表记录一个节点是否已经被访问过。
方法3:利用A和B节点数目之差
观察本文开始给的图示,我们可以看到如果两个链表A和B相交,他们将呈现一个Y字形,我们利用A和B的节点数目之差就可以判断他们在什么地方相交了,步骤如下:
1)计算出链表A的节点数目,记做c1;
2)计算出链表B的节点数目,记做c2;
3)算出节点数目之差:d = abs(c1 - c2);
4)现在从节点数较多的链表开始,从头往前走过d个节点,从此节点往前走,两个链表有相同数目的节点。
5)此时我们可以同时遍历两个链表直到找到一个交点。
这个算法的复杂度是O(m+n),是推荐使用的方法