Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 合并两个相等链表的Runner技术_Algorithm_Linked List - Fatal编程技术网

Algorithm 合并两个相等链表的Runner技术

Algorithm 合并两个相等链表的Runner技术,algorithm,linked-list,Algorithm,Linked List,所以,我在这里面临一个疑问 我正在读《破解密码》这本书。下面的文字写在那里 假设你有一个链表a1->a2….->an->b1->b2….bn,你想把它重新排列成a1->b1->a2->b2->….an->bn。你不知道链表的长度,但你只知道它是一个偶数 (此处两个链表的长度相同) 对于p2的每一次移动,可以让一个指针p1(快速指针)每两个元素移动一次。当p1到达链表的末尾时,p2将位于端点。然后,将p1移回到前面,开始“编织”元素。在每次迭代中,p2选择一个元素并将其插入p1之后 我不明白当p1

所以,我在这里面临一个疑问

我正在读《破解密码》这本书。下面的文字写在那里

假设你有一个链表
a1->a2….->an->b1->b2….bn
,你想把它重新排列成
a1->b1->a2->b2->….an->bn
。你不知道链表的长度,但你只知道它是一个偶数

(此处两个链表的长度相同)

对于p2的每一次移动,可以让一个指针p1(快速指针)每两个元素移动一次。当p1到达链表的末尾时,p2将位于端点。然后,将p1移回到前面,开始“编织”元素。在每次迭代中,p2选择一个元素并将其插入p1之后

我不明白当p1到达链表的末尾时,p2怎么会在中点。如果n=3(长度=6),我就是这样想象的。下面的每一步都代表一次迭代

1. a1 (p1, p2)->a2->a3->b1->b2->b3 
2. a1->a2 (p2)->a3 (p1)->b1->b2->b3 
3. a1->a2->a3 (p2)->b1->b2 (p1)->b3 
4. Index out of bounds error because p2 now points to a node after b3.

我哪里出错了吗?

在第二个位置启动p2

a1(p1)-> a2 (p2) -> a3 -> a4 -> b1 -> b2 -> b3 -> b4  
a1-> a2 (p1) -> a3 -> a4 (p2)-> b1 -> b2 -> b3 -> b4  
a1-> a2  -> a3(p1) -> a4 -> b1 -> b2(p2) -> b3 -> b4  
a1-> a2  -> a3 -> a4(p1) -> b1 -> b2 -> b3 -> b4(p2)  

n=2
。我们从一个列表开始:

a1 -> a2 -> b1 -> b2
p1
成为一个“快速”指针,最初指向头部的后续部分。
p2
成为最初指向头部的“慢速”指针

      p1
a1 -> a2 -> b1 -> b2
p2
我们将
p1
移动两次,将
p2
移动一次,直到
p1
到达列表的末尾(没有下一个)

p1
移回头部

p1                  
a1 -> a2 -> b1 -> b2
      p2
高级
p2

p1                  
a1 -> a2 -> b1 -> b2
            p2
“编织”开始了

获取由
p2
指向的元素,并将其移动到
p1
之后。插入元素后,前进
p1

            p1                  
a1 -> b1 -> a2 -> b2
                  p2
                       p1      
a1 -> b1 -> a2 -> b2  
                  p2
获取由
p2
指向的元素,并将其移动到
p1
之后。插入元素后,前进
p1

            p1                  
a1 -> b1 -> a2 -> b2
                  p2
                       p1      
a1 -> b1 -> a2 -> b2  
                  p2

p1
为空,终止。

您可以简单地使用Java实现:

public static void findMidElOfLinkedList(FindMidElementOfLinkedList findMidElementOfLinkedList) {
    Node node = findMidElementOfLinkedList.head;
    Node slow = node;
    Node fast = node;

    while (fast != null && fast.next != null) {
        fast = fast.next.next; // increase 2
        slow = slow.next; // increate 1
    }
    System.out.println(slow.data);
    /*
    * Slow runner goes at a pace of 1 element per move, fast runner goes 2 elements per move.
    When the fast runner reaches the end of the linked list, then slow runner is sitting at the middle. Testing this out for one/two middle cases work.
    Time O(N), faster than the previous brute force method, Space: O(1).
    * */
}

假设您有一个链接列表a1->a2….->an->b1->b2….bn,并且希望将其重新排列为a1->a2->…an->b1->b2….->bn.
?很抱歉输入错误。更正了问题。我的错。编织在这里到底意味着什么?很好的解释。谢谢你的帮助。:)