大多数站点都提供此解决方案(请参阅方法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 -> 7
与1 -> 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/