最近看了破解代码,第2章介绍了解决多数链表问题的runner方法。
给定链表 a1 a2...an b1 b2...bn 重新排列为 a1 b1 a2 b2...an bn。
它说我们应该使用两个跑步者,速度快的应该是慢速的两倍。
因为总数是偶数,所以越快跑到最后,越慢的在链表中间。然后将较快的跑步者放在链表的开头,并在较快的跑步者之后插入较慢者指向的元素。
我知道这个原则,但我的问题是:
例如
1 2 3 4 1 2 3 4
起初,两个跑步者都指向“1”,
那么跑得快的人指向“3”,跑得慢的人指向“2”。
较快的 funner 指向第二个“1”,较慢的指向“3”。
跑得快的人指向第二个“3”,跑得慢的人指向“4”。
接着 ?我应该怎么办?我不能把快跑者放在第一个“1”,因为我还没有到达链表的末尾。与较慢的相同,它还没有到达链表的中间。
如果我在链表中添加一个头,那么快跑者和慢跑者可以到达中间和终点。我的意思是它看起来像下面这样:
0 1 2 3 4 1 2 3 4;
所以我想知道,如果我想使用 runner 方法来解决这个问题,我应该为快跑者和慢跑者添加索引吗?