[23] oferta gana el nodo de la lista anillo de entrada vinculados

título Descripción

Para una lista enlazada, en donde si los comprende el anillo, encontrar la lista de nodos anillo de entrada, de lo contrario, null salidas.

pensamiento

Dos soluciones de las ideas (entendiendo el segundo enfoque recomendado dibujo, será más intuitivo)

  • HashMap coloca a través de cada elemento, el final de los valores duplicados, sin embargo, no hay anillo de descripción. Encuentros valores duplicados, lo que indica que el nodo de entrada de anillo

  • Velocidad del puntero 1. Si el puntero de cola completa sin ir más rápido encontrar ningún puntero anillo. Si se puede satisfacer la velocidad del puntero, debe describirse anillo y el punto de encuentro en el anillo. Cómo determinar el nodo del anillo

    • También dos punteros P1, el punto p2 al nodo de cabeza, si hay n anillos (n = b + c) nodos, un puntero P2 seguir adelante n pasos, después de que los dos punteros al caminar. Los nodos que cumplen con el anillo de entrada.
      • ¿Por qué se cumple cuando el anillo de entrada? p2 seguir adelante n pasos, y luego caminar al mismo tiempo. Así que ir primero a caminar la distancia equivalente de b + c. Cuando la distancia un p1 de distancia, p2 caminaba distancia b + c + a. Sólo para el anillo de entrada.
    • ¿Cómo se conoce el número de nodos en el anillo n? La velocidad puede ser determinada por la existencia de un anillo de puntero, y debe cumplir con el punto en el ring. De este nodo, mientras se mueve el recuento, cuando una vez más volver a este nodo cuando se puede obtener el número de nodos en el anillo.
  • 2 la velocidad del puntero. Una primera velocidad del puntero para lograr problemas, puede venir de la resolución de problemas matemáticos. Cuando la velocidad de la p1 puntero, se reúnen p2, reposicionará el p2 nodo cabeza y luego mover de forma simultánea. Es el punto de encuentro del anillo de entrada. Certificar la siguiente manera:
    Aquí Insertar imagen Descripción

import java.util.HashSet;

public class Offer23_EntryNodeOfLoop {

    public ListNode entryNodeOfLoop_HashSet(ListNode pHead) {
        if (pHead == null || pHead.next == null) return null;

        HashSet<ListNode> hashSet = new HashSet<ListNode>();
        while (pHead != null) {
            if (hashSet.contains(pHead)) {
                return pHead;
            }
            hashSet.add(pHead);
            pHead = pHead.next;
        }
        return null;
    }

    public ListNode entryNodeOfLoop_FastSlow(ListNode pHead) {
        if (pHead == null || pHead.next == null || pHead.next.next == null) return null;

        ListNode slow = pHead.next;
        ListNode fast = pHead.next.next;

        while (slow != fast) {
            if (fast.next == null || fast.next.next == null) return null;
            fast = fast.next.next;
            slow = slow.next;
        }

        fast = pHead;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }

}

Si usted está interesado en el aspecto lata [más sobre una serie de cuestiones se cruzan dos listas ]

Publicado 89 artículos originales · elogios ganado 13 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/Dawn510/article/details/105247531
Recomendado
Clasificación