Leetcode141. Determine si hay un anillo en la lista vinculada
Idea: establezca los punteros duales rápidos y lentos, el puntero lento +1 es el puntero rápido +2. Si no contiene un anillo, el puntero rápido eventualmente encontrará un valor nulo, lo que indica que la lista vinculada no contiene un anillo; si contiene un anillo, el puntero rápido eventualmente será un puntero súper lento y se encontrará con el puntero lento, lo que indica que la lista vinculada contiene un anillo. La complejidad del tiempo es O (n).
Leetcode142. Determine la entrada del anillo de la lista vinculada
Idea: puntero doble, lo mismo que el simple problema de la lista de timbres Cuando el primer puntero y el puntero rápido (1) se encuentran, hay rápido = lento + k longitud del anillo y rápido = 2 lento para obtener lento = k longitud del anillo. Nota: Suponiendo que un puntero puede ir un paso desde el encabezado de la lista enlazada al nodo de entrada del anillo, entonces el número de pasos desde el encabezado de la lista enlazada hasta la entrada del anillo es una longitud del anillo + k , por lo que se puede alcanzar un paso lento después de la primera intersección Después de que los dos primeros punteros se encuentren en la entrada del anillo (2), deje que el nodo rápido apunte al encabezado de la lista vinculada. Luego, los punteros rápidos y lentos avanzan sincrónicamente, para asegurar que cuando el segundo encuentro, los punteros rápidos y lentos apunten a la entrada del anillo.
public ListNode detectCycle(ListNode head){if(head==null)return null;
ListNode slow = head;
ListNode fast = head;while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;if(fast == slow)break;}
fast = head;//快指针指回头结点while(slow!=fast){//第二次相交前快慢指针都一步步走
fast = fast.next;
slow = slow.next;}return slow;}