求两个链表的第一个节点

来源:互联网 发布:java如果输入错误跳出 编辑:程序博客网 时间:2024/06/07 07:12

参考编程之美的第三章 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),是推荐使用的方法

原创粉丝点击