【问题标题】:Finding the merging node of two linked list?找到两个链表的合并节点?
【发布时间】:2014-10-02 16:18:54
【问题描述】:

我已经通过这个link 接受了 答案描述了下面的算法来找到合并节点

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

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

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

我不确定它是否总是有效?敌人示例:- 列表 1 有 10 个节点,列表 2 有 3 个节点,其中第一个节点正在合并节点(所以形状字母“V”倒置)。现在如果我经过上面 算法,

1)M=10,N=3

2)M-N 将是 7

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

现在我永远不会捕获合并节点(这是这里的第一个节点)。我是否在我的不理解中遗漏了什么,或者这个算法有一些缺陷?

【问题讨论】:

  • “M-N 将是 3”。不应该是7吗?无论如何,如果第一个节点是合并节点,这是否意味着列表完全相同?
  • 这与 java 或 C 有什么关系,而不是完全与语言无关?
  • @Kevin 我已经更正了。但我的问题还是一样。
  • @scott 更正了这一点
  • 第8个节点这里的正确答案,你只需要将它与第二个列表中的第1个节点进行比较。把它画在一张纸上。

标签: algorithm


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    在两个列表合并之后,它们将完全一样,因为both of them point to the same memory 所以下一项将是相同的。 如果它们都从第一个节点开始,它们将完全相同,因为它们将指向内存中完全相同的位置,请考虑一下,您如何区分第一个列表和第二个列表? 它们具有不同长度的唯一方法是,如果较短的列表位于交叉点之后的较长列表的中间,则它们是相同的。在交叉点之后,它们的长度相同。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多