- до цикла есть k шагов. Мы не знаем, что такое k, и нам не нужно это выяснять. Мы можем работать абстрактно только с к.
- после k шагов
----- T находится в начале цикла
----- H это k шагов в цикле (он пошел 2k всего и, следовательно, k в цикл)
** они теперь имеют размер петли - k отдельно
(обратите внимание, что k == K == mod (loopsize, k) - например, если узел проходит 2 шага в цикле из 5 узлов, он также включает 7, 12 или 392 шага, поэтому насколько велик цикл К не учитывает.
Так как они догоняют друг друга со скоростью 1 шаг в единицу времени, потому что один движется в два раза быстрее другого, они встретятся в петле - k.
Это означает, что для достижения начала цикла потребуется k узлов, и, таким образом, расстояние от начала до начала цикла и столкновения до начала цикла одинаковы.
Так что теперь после первого столкновения верните Т обратно в голову. T и H встретятся при старте, если вы двигаетесь со скоростью 1 каждый. (по k шагов для обоих)
Это означает, что алгоритм:
- от движения головы T = t.next и H.next.next, пока они не столкнутся (T == H) (есть цикл)
// позаботиться о случае, когда k = 0 или T и H встретились в начале цикла
расчет длины петли
- считать длину цикла, перемещая T или H вокруг него со счетчиком
- переместить указатель T2 в начало списка
- переместить указатель на длину шага цикла
- переместить другой указатель H2 на голову
- перемещать Т2 и Н2 в тандеме, пока они не встретятся в начале цикла
вот и все!