面试算法题大全(链表)

【算法面试题】求两个相交链表的首个相交节点(转)

有两个单向链表A和B如下图所示,他们相交于某个节点(在这个例子里为15),写一个程序把第一个交点找出来:

《面试算法题大全(链表)》

方法1:利用两次循环

 

foreach nodeA in listA

   foreach nodeB in listB

      if nodeB == nodeA

         then A and B intersect at the current node, i.e., nodeA (or equivalently nodeB)

假设链表A的长度是m,链表B的长度是n,这个算法的复杂度是O(mn),不太理想。

方法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),是推荐使用的方法。

    原文作者:pang3510726681
    原文地址: https://blog.csdn.net/pang3510726681/article/details/7590182
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞