面试算法题大全(链表)

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

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

面试算法题大全(链表)_第1张图片

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




你可能感兴趣的:(面试算法题大全(链表))