【发布时间】:2019-04-06 05:04:12
【问题描述】:
2 所以,我在这里面临一个疑问。
我正在阅读《破解编码面试》这本书。下面的文字写在那里。
假设你有一个链表 a1->a2....->an->b1->b2...bn,你想把它重新排列成 a1->b1->a2->b2- >.....an->bn。你不知道链表的长度,但你只知道它是一个偶数。
(这里两个链表长度相同)
你可以让一个指针 p1(快速指针)每两个元素移动一次 p2 每移动一次。当 p1 到达链表的末尾时,p2 将在端点处。然后,将 p1 移回前面并开始“编织”元素。在每次迭代中,p2 选择一个元素并将其插入到 p1 之后。
我不明白当 p1 到达链表的末尾时,p2 会在中点。如果n = 3(长度= 6),这就是我的想象。下面的每一步都代表一个迭代。
我尝试了由 4 个元素组成的链接列表,并成功实现了结果。但是,我无法解决一般情况,因为我的指针很不稳定。是否可以为python中的问题提供代码,我被卡住了。这是我的代码:
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
【问题讨论】:
-
“是否可以在 python 中为问题提供代码”——首先,Stack Overflow 不是代码编写服务。您应该发布您的工作,展示您迄今为止尝试过的内容,并让您的问题具体针对您遇到的具体问题。其次,如果您对您的问题和答案所使用的语言有特殊要求,则需要将该语言作为问题的标签包含在内。
-
除此之外,您的问题甚至不清楚问题是什么。我发现很明显,如果您要遍历长度为 M 的列表,其中 M = 2 * N,每次另一个指针前进一个时,一个指针前进两个节点(即跳过一个节点),那么第一个指针将在列表中移动两次和第二个一样快,因此当第一个到达终点时,第二个只会走到一半(一个速度是另一个速度的两倍,另一个速度是第一个速度的一半)。
-
@PeterDuniho 可以看到,我已经实现了慢指针在中间,快指针在开头的时刻。但是,我对第二个 while 循环中的指针感到困惑
-
由于缺少minimal reproducible example,您可能对您的问题不太感兴趣。也就是说:在您发布的代码中,我建议您删除最后一行代码,并且您应该添加语句来推进您的
fast和slow指针。我也不会在第二个循环中使用名称fast和slow,因为这些名称不再描述指针。最后,不要低估铅笔和纸的用处,手动跟踪您的算法,并绘制图表显示每个语句的列表状态。