Inicio del ciclo de una lista

Tiempo límite 2 s
Memoria límite 256 MB
Casos de prueba 9
Dificultad Medio Algoritmos
Mostrar (2) Dos punterosListas enlazadas
Enviar solución

Puntos: 10

Tipos de problema
Lenguajes permitidos
C, C++, Java, Python, Rust

Una lista enlazada tiene \(n\) nodos con rótulos de \(1\) a \(n\). Cada nodo apunta al siguiente, y el último puede apuntar a un nodo anterior, formando un ciclo. Encuentra el nodo donde empieza el ciclo: el primero que se visita dos veces al recorrer la lista desde la cabeza. Si no hay ciclo, la respuesta es \(0\).

Seguimiento: el algoritmo de Floyd lo resuelve con \(O(1)\) memoria extra.

Entrada

La primera línea tiene \(n\) \((1 \le n \le 10^5)\) y el rótulo de la cabeza. Cada una de las siguientes \(n\) líneas tiene un rótulo \(u\) y el rótulo del nodo al que apunta, o \(0\) si \(u\) es la cola sin ciclo. Las líneas vienen en cualquier orden y todos los nodos son alcanzables desde la cabeza.

Salida

El rótulo del nodo donde empieza el ciclo, o \(0\).

Ejemplo 1

Entrada

4 3
3 2
2 4
4 1
1 2

Salida

2

Ejemplo 2

Entrada

2 1
1 2
2 1

Salida

1

Ejemplo 3

Entrada

1 1
1 0

Salida

0

Comentarios

No hay comentarios por el momento.