Método de doble puntero circular enlazada lista II

tema

LeetCode 142. Lista circular vinculada II

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. Tenga en cuenta que pos solo se utiliza para identificar el anillo y no se pasará a la función como parámetro.

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

Avanzado:

¿Puedes resolver este problema usando el espacio O (1)?

Ejemplo 1:

Inserte la descripción de la imagen aquí

Entrada: head = [3,2,0, -4], pos = 1
Salida: Devuelve el nodo de la lista enlazada con el índice 1
Explicación: Hay un anillo en la lista enlazada, y su cola está conectada al segundo nodo.
Ejemplo 2:

Inserte la descripción de la imagen aquí

Entrada: cabeza = [1,2], pos = 0
Salida: Devuelve el nodo de la lista enlazada con índice 0.
Explicación: Hay un anillo en la lista enlazada cuya cola está conectada al primer nodo.
Ejemplo 3:
Inserte la descripción de la imagen aquí

Entrada: cabeza = [1], pos = -1
Salida: retorno nulo
Explicación: No hay anillo en la lista enlazada.

inmediato:

El rango del número de nodos en la lista vinculada está en el rango [0, 104]
-105 <= Node.val <= 105
El valor de pos es -1 o un índice válido en la lista vinculada

Ideas y algoritmos para la resolución de problemas

Inserte la descripción de la imagen aquí

Código

public class Solution {
    
    
    public ListNode detectCycle(ListNode head) {
    
    
        ListNode pos = head;
        Set<ListNode> visited = new HashSet<ListNode>();
        while (pos != null) {
    
    
            if (visited.contains(pos)) {
    
    
                return pos;
            } else {
    
    
                visited.add(pos);
            }
            pos = pos.next;
        }
        return null;
    }
}

Inserte la descripción de la imagen aquí

Código

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode slow = head, fast = head;
        while (fast.next!=null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (fast == slow) {
                ListNode ptr = head;
                while (ptr != slow) {
                    ptr = ptr.next;
                    slow = slow.next;
                }
                return ptr;
            }
        }
        return null;
    }
}

Supongo que te gusta

Origin blog.csdn.net/a12355556/article/details/113445689
Recomendado
Clasificación