[La espada se refiere a la oferta] El nodo de la entrada del anillo en la lista vinculada

Descripción del Título:

Para una lista vinculada, si contiene un anillo, busque el nodo de entrada del anillo de la lista vinculada; de lo contrario, la salida es nula.

Ideas de resolución de problemas:

Solución de
puntero rápido y lento : para este problema, podemos usar una solución de dos punteros, uno rápido y otro lento.
El puntero rápido ejecuta dos elementos a la vez y el puntero lento ejecuta uno a la vez. Si hay un círculo, algún día, el puntero rápido podrá alcanzar al puntero lento.
Como se muestra en la figura siguiente, primero encontramos el punto donde se encuentran los punteros rápido y lento, p. Supongamos además que la entrada del anillo está en el punto q, la distancia desde el nodo principal al punto q es A, la distancia entre dos puntos qp es B y la distancia entre dos puntos pq es C.
Debido a que el puntero rápido es dos veces más rápido que el puntero lento, y se encuentran en el punto p, podemos obtener la ecuación 2 (A + B) = A + B + C + B. (Si la lista vinculada frente al anillo es muy largo y el anillo es corto, entonces el puntero rápido puede girar varias veces después de entrar en el anillo (asumiendo n vueltas) antes de que se encuentre con el puntero lento. Pero en cualquier caso, el puntero lento se encontrará con el rápido cuando entre en el primer círculo del anillo. La ecuación debe corregirse. 2 (A + B) = A + nB + (n-1) C) De la ecuación de 3, podemos obtener que C = A.
En este momento, debido a que nuestro puntero lento ya está en p, podemos crear un nuevo puntero, slow2, y dejar que comience desde el nodo principal, y solo vaya al siguiente cada vez. El puntero lento original continúa manteniendo el original. manera, lo mismo que slow2. Solo sigue uno a la vez.
Esperamos el encuentro entre slow2 y el puntero lento original, porque sabemos que A = C, así que cuando se encuentran, debe ser q.
Podemos volver a lento2 o lento, porque apuntan al mismo nodo en ese momento, que es el punto de partida del anillo, q.
Inserte la descripción de la imagen aquí

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    
    

    public ListNode EntryNodeOfLoop(ListNode pHead) {
    
    
        ListNode fast = pHead;
        ListNode slow = pHead;
        while(fast != null && fast.next != null ) {
    
    
            fast = fast.next.next;
            slow = slow.next;
            if(slow == fast) {
    
    
                ListNode slow2 = pHead;
                while(slow != slow2) {
    
    
                    slow2 = slow2.next;
                    slow = slow.next;
                }
                return slow;
            }
        }
        return null;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_45621376/article/details/114648830
Recomendado
Clasificación