El nodo común dos primeras listas (26)

título

[Introduzca las dos listas para encontrar su primer nodo común]


1, el análisis

  • El método es el uso de la violencia una lista (de longitud m) cada elemento se compararon con otra lista (de longitud n) de elementos, la complejidad de tiempo es la ( metro * norte ) O (m * n)

  • Un análisis más detallado, dos listas tienen un nodo común, un nodo desde el principio, su p-> siguiente idénticos (es decir, un puntero al mismo nodo). Y porque la lista es de un solo sentido lista enlazada, por lo que desde el comienzo del primer nodo común, después de todos sus nodos son coincidentes, hasta el último extremo. Ejemplo muestra a continuación:
    Aquí Insertar imagen Descripción

  • Luego hay dos ideas

    • Con espacio auxiliar: Desde el nodo común más probable es que al final de la lista (hay también caso extremo es el primer nodo es un nodo común, es decir, dos listas son idénticos), por lo que puede comenzar desde el recorrido nodo de cola, y avanzar gradualmente hacia adelante, hasta que averiguar primero un nodo común. Este método necesita la pila para las dos listas se almacenan que, como la pila es avanzada a cabo, se compara primero nodo de cola. Dado que este método por medio de las dos pilas, la complejidad espacio es por lo tanto la ( metro + norte ) O (m + n) , la complejidad del tiempo es la ( metro + norte ) O (m + n) .
    • cadena larga ir primero método: En primer lugar, dos listas son atravesados, para obtener dos longitudes de cadena. A continuación, busque la diferencia de longitud entre las dos listas se dis, para hacer una larga lista va dis primer paso, y luego dejar ir dos listas al mismo tiempo, y si se llevó un nodo relativamente común. Dos listas simultáneamente para el nodo de cola. Este método no requiere espacio auxiliar, mientras que su complejidad temporal es también la ( metro + norte ) O (m + n) , por lo que el método es mejor

2, el código

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(pHead1==nullptr || pHead2==nullptr)
            return nullptr;
        ListNode *p1=pHead1, *p2=pHead2;
        int listCount1=0, listCount2=0;
        while(p1!=nullptr)
        {
            ++listCount1;
            p1=p1->next;
        }
        while(p2!=nullptr)
        {
            ++listCount2;
            p2=p2->next;
        }
        p1=pHead1, p2=pHead2;
        unsigned dis=0;
        if(listCount1>listCount2)
        {
            dis=listCount1-listCount2;
            while(dis)
            {
                p1=p1->next;
                dis--;
            }
        }
        else
        {
            dis=listCount2-listCount1;
            while(dis)
            {
                p2=p2->next;
                dis--;
            }
        }
        while(p1!=nullptr && p2!=nullptr)
        {
            if(p1==p2)
            {
                return p1;
            }
            p1=p1->next;
            p2=p2->next;
        }
    }
};
Publicados 213 artículos originales · ganado elogios 48 · vistas 110 000 +

Supongo que te gusta

Origin blog.csdn.net/Jeffxu_lib/article/details/104868219
Recomendado
Clasificación