大多数站点都提供此解决方案(请参阅方法3,位于http://www.geeksforgeeks.org/write-a-function-to-get-the-intersection-point-of-two-linked-lists/


  1)获取第一个列表中节点的数量,使数量为c1。
  
  2)获取第二个列表中节点的计数,令计数为c2。
  
  3)获得计数差d = abs(c1 – c2)
  
  4)现在遍历从第一个节点到d个节点的较大列表,因此
  从这里开始,两个列表的节点数均相等。
  
  5)然后我们可以并行遍历两个列表,直到遇到
  一个公共节点。 (请注意,获取公共节点是通过比较
  节点的地址)


我的理解是,如果第一个节点本身正在合并节点,则上述解决方案将无法工作。说list1有5个元素,list2有3个元素,其中element1是
合并点。根据上述算法,差异计数为2。因此,我们首先遍历list1中的前2个节点。从列表中的3个元素开始,
遍历元素毫不一一列出。所以我永远也不会得到合并点。是不是

我建议的解决方案:

1)遍历列表1。

2)将每个元素的内存地址(带有System.identitityHashMap)放入基于哈希的数据结构中

3)遍历列表2.获取每个元素的内存地址,并查看其是否存在于哈希图中。如果是,则是合并点。

更新:-输入为

list1 = 1 -> 3 -> 5 -> 6 -> 7

list2 = 1 -> 4 -> 5

根据解决方案建议,链接大小的差异为2。首先遍历list1中的3,然后将5 -> 6 -> 71 -> 4 -> 5进行比较。因此,此处缺少合并点1。

最佳答案

我的理解是,如果第一个节点本身是上述解决方案将不起作用
  合并节点


您的理解是错误的,只要方法可行。考虑您的示例:

list1 = 1 -> 2 -> 3 -> 4 -> 5

list2 = 3 -> 4 -> 5和节点3是交点。

差d = 5-3 = 2,

在步骤4)之后,list1将被转发2,并将指向3 -> 4 -> 5,因此它将指向与list2完全相同的节点,这将通过在步骤5)进行的第一次比较来揭示。

因为您是用Java实现的,所以要比较“元素内存地址”(来自您的建议),您只需比较引用,只有当引用(指向)相同的对象时,引用才会相等。

希望能有所帮助。

关于java - 求两个链表的交点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23309427/

10-13 06:02