Notas de cepillado de LeetCode _142. Lista enlazada circular II

El tema es de LeetCode

142. Lista circular vinculada II

Se puede acceder a otras soluciones o código fuente: tongji4m3

descripción

Dada una lista vinculada, devuelva el primer nodo donde la lista vinculada comienza a ingresar al bucle. Si la lista vinculada no tiene anillos, se devuelve un valor nulo.

Para representar los anillos en una lista vinculada dada, usamos el entero pos para indicar la posición donde el final de la lista vinculada está conectado a la lista vinculada (el índice comienza desde 0). Si pos es -1, entonces no hay ningún anillo en la lista vinculada.

Nota: No está permitido modificar la lista vinculada dada.

Ejemplo 1:

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

Ejemplo 2:

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

Ejemplo 3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

Ideas

Deje que los punteros rápido y lento se encuentren primero, y luego deje que un puntero comience desde el principio y se mueva hacia atrás al mismo tiempo con el puntero lento. Cuando se encuentren, llegarán a la entrada (puede hacer un dibujo para demostrar la exactitud)

detalle

Al juzgar si hay una lista enlazada circular, primero devuelva la lista enlazada no circular directamente para evitar el error lógico de encontrar el primer nodo más tarde

Código

public ListNode detectCycle(ListNode head)
{
    
    
    ListNode fast = head, slow = head;
    while (true)
    {
    
    
        if(fast == null || fast.next == null) return null;
        fast = fast.next.next;
        slow = slow.next;
        if (slow == fast) break;
    }
    //必然有循环
    fast = head;
    while (true)
    {
    
    
        if(slow==fast) return fast;
        fast = fast.next;
        slow = slow.next;
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42249196/article/details/108657625
Recomendado
Clasificación