我已经接受了这个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 列表。
现在我永远不会抓住合并节点(这里是第一个节点)。我遗漏了一些未完成的东西,还是这个算法中存在一些缺陷?
答案 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
完全相同,因此下一个项目将是相同的。
如果它们都将在第一个节点上启动它们将完全相同,因为它们将指向内存中完全相同的位置,想一想,你怎么能从第二个节点告诉第一个列表?
它们具有不同长度的唯一方式是,如果较短的列表位于交叉点之后的较长的列表中间,则它们是相同的。在十字路口之后,他们都有相同的长度。
所以,为了解决问题我们希望列表的长度相同,那么它们在交集之前和之后都会有相同数量的元素。 在完成之后,一步一步地传递所有不同的项目,直到我们找到相同的项目。