Python 3.x Runner技术,用于组合两个一般大小的相等链表
二, 所以,我在这里面临一个疑问 我正在读《破解密码》这本书。下面的文字写在那里 假设你有一个链表a1->a2….->an->b1->b2….bn,你想把它重新排列成a1->b1->a2->b2->….an->bn。你不知道链表的长度,但你只知道它是一个偶数 (此处两个链表的长度相同) 对于p2的每一次移动,可以让一个指针p1(快速指针)每两个元素移动一次。当p1到达链表的末尾时,p2将位于端点。然后,将p1移回到前面,开始“编织”元素。在每次迭代中,p2选择一个元素并将其插入p1之后 我不明白当p1到达链表的末尾时,p2怎么会在中点。如果n=3(长度=6),我就是这样想象的。下面的每一步都代表一次迭代 我尝试了由4个元素组成的链接列表,并成功地实现了结果。然而,我无法解决一般情况,因为我的指针会变得危险。有没有可能用python为这个问题提供代码,我被卡住了。这是我的代码:Python 3.x Runner技术,用于组合两个一般大小的相等链表,python-3.x,linked-list,Python 3.x,Linked List,二, 所以,我在这里面临一个疑问 我正在读《破解密码》这本书。下面的文字写在那里 假设你有一个链表a1->a2….->an->b1->b2….bn,你想把它重新排列成a1->b1->a2->b2->….an->bn。你不知道链表的长度,但你只知道它是一个偶数 (此处两个链表的长度相同) 对于p2的每一次移动,可以让一个指针p1(快速指针)每两个元素移动一次。当p1到达链表的末尾时,p2将位于端点。然后,将p1移回到前面,开始“编织”元素。在每次迭代中,p2选择一个元素并将其插入p1之后 我不明白
def runner_technique_ex(self, head):
"""
Assume the length of the ll that we will run thru will be even
:param head:
:return:
"""
slow = head
fast = head.next
while fast.next is not None:
slow = slow.next
fast = fast.next.next
fast = head
slow = slow.next
while slow.next is not None:
tempSlow = slow
tempFast = fast.next
fast.next = tempSlow
slow = slow.next
tempSlow.next = tempFast
tempFast.next = slow
经过一番斗争才明白
def runner_technique_ex(self, head):
"""
Assume the length of the ll that we will run thru will be even
:param head:
:return:
"""
slow = head
fast = head.next
while fast.next is not None:
slow = slow.next
fast = fast.next.next
fast = head
slow = slow.next
newHead = Node(fast.data)
newHeadExtraPointer = newHead
newHead.next = Node(slow.data)
newHead = newHead.next
while slow.next is not None:
fast = fast.next
slow = slow.next
fastNextNode = Node(fast.data)
slowNextNode = Node(slow.data)
fastNextNode.next = slowNextNode
newHead.next = fastNextNode
newHead = fastNextNode.next
return newHeadExtraPointer
“有可能用python为这个问题提供代码吗”——首先,堆栈溢出不是一种代码编写服务。你被要求发布你的作品,展示你迄今为止所做的尝试,并将你的问题具体化到你遇到的问题上。第二,如果你对你的问题和答案所用的语言很挑剔,你需要在你的问题上加上这种语言作为标签。除此之外,你的问题中甚至不清楚问题是什么。我发现很明显,如果你正在遍历一个长度为M的列表,其中M=2*N,一个指针每次向前移动两个节点(即跳过一个),那么第一个指针在列表中移动的速度将是第二个指针的两倍,因此当第一个指针到达末尾时,第二个只会中途(一个速度是另一个速度的两倍,和另一个速度的一半一样)。正如你所看到的,我已经达到了慢指针位于中间,快速指针位于开始的那一刻。然而,我对第二个循环中的指针感到困惑,而你可能对你的问题不太感兴趣,因为缺少一个循环。这就是说:在您发布的代码中,我建议删除最后一行代码,并添加语句以推进
fast
和slow
指针。我也不会在第二个循环中使用名称fast
和slow
,因为这些名称不再描述指针。最后,不要低估铅笔和纸的用处,手动跟踪算法,并绘制图表,在每个语句中显示列表的状态。