找到两个链表的合并节点?

时间:2014-10-02 16:18:55

标签: algorithm

我已经接受了这个link  回答下面的算法,找到合并节点

  

1)遍历两个链表以找到M和N.

     

2)回到头部,然后遍历| M - N |节点就越长   列表。

     

3)现在进入锁步并比较节点,直到找到   常见的。

我不确定它会一直有效吗?例如: - 列表1有10个节点,列表2有3个节点,其中第一个节点正在合并节点(所以形状字母" V"颠倒)。现在,如果我走到上面 ALGO,

  

1)M = 10,N = 3

     

2)M-N将是7

     

3)我选择列表1并遍历前7个节点。现在我开始比较每个   节点从list1中的第8个节点开始,所有节点都是second   列表。

现在我永远不会抓住合并节点(这里是第一个节点)。我遗漏了一些未完成的东西,还是这个算法中存在一些缺陷?

2 个答案:

答案 0 :(得分:0)

如果您建议每个列表的第一个节点是合并节点,那么您就误解了该问题。

在合并节点之后,两个列表是相同的(因为该节点在两者中都是相同的,它必须指向必须指向相同后继者的相同后继者,等等)。这个算法使用的关键是,从合并节点开始,它与列表末尾之间的项目数量相同。

本质上,算法找到列表的长度,然后遍历到较长列表上的节点,这意味着节点和另一个列表的第一个节点与末尾的距离相同。然后它沿着节点走,直到找到匹配的节点。

在您的示例中,第8个节点是最早可以找到合并的节点。这是因为第7个节点后面有三个节点(8,9和10),但是另一个节点中的第一个节点后面只有两个节点,因此第7个节点不能是合并的节点。

所以比较节点A8和B1,如果它们不匹配则比较A9和B2,如果它们与A10和B3不匹配,如果它们不匹配则实际上没有合并节点。 (A表示列表A中的第n个节点,如果不明显的话)。

答案 1 :(得分:0)

在两个列表合并的点之后,它们将与both of them point to the same memory完全相同,因此下一个项目将是相同的。 如果它们都将在第一个节点上启动它们将完全相同,因为它们将指向内存中完全相同的位置,想一想,你怎么能从第二个节点告诉第一个列表? 它们具有不同长度的唯一方式是,如果较短的列表位于交叉点之后的较长的列表中间,则它们是相同的。在十字路口之后,他们都有相同的长度。

所以,为了解决问题我们希望列表的长度相同,那么它们在交集之前和之后都会有相同数量的元素。 在完成之后,一步一步地传递所有不同的项目,直到我们找到相同的项目。