Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 链表:通过在到达其中一个链表的末尾后交换其指针来查找两个链表的交集_Python_Algorithm_Data Structures_Linked List - Fatal编程技术网

Python 链表:通过在到达其中一个链表的末尾后交换其指针来查找两个链表的交集

Python 链表:通过在到达其中一个链表的末尾后交换其指针来查找两个链表的交集,python,algorithm,data-structures,linked-list,Python,Algorithm,Data Structures,Linked List,这个问题是关于寻找交叉点的特定方法,而不是这样做的一般方法。我一开始解决这个问题的方法是肯蒂姆在回答这个问题时的方法。下面引用他的回答 这需要O(M+N)时间和O(1)空间,其中M和N是总数 链接列表的长度。如果公共部分是 很长(即M,N>>M,N) 遍历两个链表以找到M和N 回到头部,然后穿过| M− 较长列表上的N个节点 现在进入锁定步骤,比较节点,直到找到常见节点 我很难理解Leetcode上的第三种解决方案。方法不同,但我觉得它可能与上述解决方案类似。有人能告诉我这两个有什么相似之处吗?

这个问题是关于寻找交叉点的特定方法,而不是这样做的一般方法。我一开始解决这个问题的方法是肯蒂姆在回答这个问题时的方法。下面引用他的回答

这需要O(M+N)时间和O(1)空间,其中M和N是总数 链接列表的长度。如果公共部分是 很长(即M,N>>M,N)

  • 遍历两个链表以找到M和N

  • 回到头部,然后穿过| M− 较长列表上的N个节点

  • 现在进入锁定步骤,比较节点,直到找到常见节点

  • 我很难理解Leetcode上的第三种解决方案。方法不同,但我觉得它可能与上述解决方案类似。有人能告诉我这两个有什么相似之处吗?我还是看不出怎么从这里到十字路口。这里提出的解决方案是:

    进近#3(两个指针)[已接受]

    保持在A和B的头部初始化的两个指针pA和pB, 分别地然后让它们都遍历列表,一个节点 一次

    当pA到达列表的末尾时,将其重定向到B的开头 (是的,B,没错。);同样,当pB到达列表的末尾时, 将它重定向到A的头部

    如果在任何点pA与pB相交,则pA/pB为交点

    看看为什么上面的技巧会起作用,考虑下面两个 列表:A={1,3,5,7,9,11}和B={2,4,9,11},在 节点“9”。由于B.length(=4) 如果两个列表相交,则它们的最后一个节点必须相同 一个。因此,当pA/pB到达列表的末尾时,记录最后一个元素 分别为A/B。如果最后两个元素不相同, 那么这两个列表就没有交集了


    他们都依赖于获取指针,使其与交叉口保持相同的距离,然后同时向前走,直到相遇

    第一种方法显式计算在较长列表上向前移动指针的次数,而第二种方法通过使两个指针都执行(m+n)步来隐式计算


    我更喜欢第二个指针,因为没有一个指针向前移动,两个指针在每次迭代中都会移动。第一种可能更适用于3+列表,因为您只需完全遍历每个列表一次。

    它们都依赖于获取指针,使其与交叉点保持相同的距离,然后同时向前走,直到它们相遇。第一种方法显式计算指针在较长列表上向前移动的次数,而第二种方法隐式计算指针向前移动的次数,方法是使两个指针都采取(m+n)步。@PatrickHaugh,你能给我一个答案让我投赞成票吗?两个列表排序了吗?@Code Pe徒弟,没有提到它们是被分类的,所以我会说,‘不,它们不是’。