Leetcode 160. Lista enlazada de intersección

tema

Dada la suma de los nodos principales de dos listas enlazadas individualmente  headA ,  headB busque y devuelva el nodo inicial donde se cruzan las dos listas enlazadas individualmente. Si no hay un nodo de intersección entre las dos listas vinculadas, devuelve  null . Los datos del título garantizan que no hay bucles en toda la estructura de la cadena.

Tenga en cuenta que la lista enlazada debe mantener su estructura original después de que la función devuelva el resultado .

Enlace: 160. Lista enlazada de intersección - LeetCode

respuesta

Juzgar si dos listas enlazadas individualmente se cruzan solo puede juzgarse comparando las direcciones de los nodos a su vez , no por el valor de los nodos. En primer lugar, debemos aclarar que si dos listas con un solo enlace se cruzan, la forma de las dos listas solo puede tener forma de Y , no de X. Si tiene forma de X, el nodo que se cruza tiene dos sucesores nodos, y Un nodo de lista enlazada individualmente solo puede tener un nodo sucesor. Por lo tanto, se puede concluir que si dos listas enlazadas se cruzan, las direcciones de los nodos de cola de las dos listas enlazadas deben ser las mismas; si las direcciones de los nodos de cola de las dos listas enlazadas no son las mismas, entonces las dos las listas enlazadas individualmente no deben cruzarse .

Por lo tanto, el programa primero puede juzgar si las direcciones de los nodos finales de las dos listas enlazadas son iguales y devolver NULL si son diferentes; si son iguales, encontrar el nodo de intersección. El método para encontrar nodos de intersección es el siguiente:

Suponiendo que las longitudes de las dos listas enlazadas individualmente son lenA y lenB respectivamente, configure los dos punteros para que apunten a los nodos principales de las dos listas enlazadas respectivamente, deje que el puntero que apunta a la lista enlazada más larga siga los pasos abs (lenA-lenB) primero, y luego los dos punteros son simultáneamente Camine hacia atrás, y compare si las direcciones de los nodos señalados por los punteros son iguales mientras camina. Si son iguales, regrese al nodo actual. Si no son iguales, camine hacia atrás en el mismo tiempo hasta que se encuentre el primer nodo de intersección.

el código se muestra a continuación:

struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) 
{
    struct ListNode* tailA = headA;
    struct ListNode* tailB = headB;
    int lenA = 1;
    int lenB = 1;
    while (tailA->next)
    {
        tailA = tailA->next;
        lenA++;
    }
    while (tailB->next)
    {
        tailB = tailB->next;
        lenB++;
    }
    if (tailA != tailB)
        return NULL;

    struct ListNode* longList = headA;
    struct ListNode* shortList = headB;
    if (lenA < lenB)
    {
        longList = headB;
        shortList = headA;
    }
    int gap = abs(lenA - lenB);
    while (gap--)
    {
        longList = longList->next;
    }
    while (longList != shortList)
    {
        longList = longList->next;
        shortList = shortList->next;
    }
    return longList;
}

Tenga en cuenta que debido a que el título establece que el número de nodos en la lista enlazada es mayor o igual a 1, no se analiza el caso de una lista enlazada vacía.

Supongo que te gusta

Origin blog.csdn.net/minLi_/article/details/131752782
Recomendado
Clasificación