160. Intersección de la lista enlazada con la implementación de Java

Descripción del Título

Escriba un programa para encontrar el nodo inicial donde se cruzan dos listas unidas.

Como las siguientes dos listas enlazadas:

Inserte la descripción de la imagen aquí

La intersección comienza en el nodo c1.

 

Ejemplo 1:

Inserte la descripción de la imagen aquí

Entrada: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
Salida: Referencia del nodo con Valor = 8
Explicación de entrada: el valor del nodo de intersección es 8 (tenga en cuenta que si dos listas vinculadas se cruzan, no puede ser 0). Contando desde los respectivos encabezados, la lista enlazada A es [4,1,8,4,5] y la lista enlazada B es [5,0,1,8,4,5]. En A, hay 2 nodos antes del nodo de intersección; en B, hay 3 nodos antes del nodo de intersección.

 

Ejemplo 2:

Inserte la descripción de la imagen aquí

Entrada: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
Salida: Referencia del nodo con valor = 2
Explicación de entrada: El valor del nodo de intersección es 2 (tenga en cuenta que si dos listas vinculadas se cruzan, no puede ser 0). A partir de los encabezados respectivos, la lista enlazada A es [0,9,1,2,4] y la lista enlazada B es [3,2,4]. En A, hay 3 nodos antes del nodo de intersección; en B, hay 1 nodo antes del nodo de intersección.

 

Ejemplo 3:

Inserte la descripción de la imagen aquí

Entrada: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
Salida: nula
Explicación de entrada: contando desde el encabezado respectivo, la lista enlazada A es [ 2,6,4], la lista enlazada B es [1,5]. Dado que estas dos listas enlazadas no se cruzan, intersectVal debe ser 0, y skipA y skipB pueden ser valores arbitrarios. Explicación: Las dos listas vinculadas no se cruzan, por lo que se devuelve un valor nulo.

 

Nota:

Si no hay intersección entre las dos listas vinculadas, se devuelve un valor nulo. Después de que se devuelva el resultado, las dos listas vinculadas deben mantener la estructura original. Se puede suponer que no hay ciclos en toda la estructura de la lista enlazada. El programa intenta satisfacer la complejidad de tiempo O (n) y solo usa memoria O (1).

 

Solución 1: fuerza bruta (bucle doble)

Para cada elemento en la lista vinculada A, vaya a la lista vinculada B para averiguar si existe, y debe ejecutarse m * n veces

public class Solution {
    
    
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
        // 如果其中一个为空,返回null
        if (headA == null || headB == null) return;
        
        ListNode A = headA;
        
        while (null != A) {
    
    
            ListNode B = headB;
            while (null != B){
    
    
                // 如果相等则返回交点
                if (B == A){
    
    
                    return A;
                }
                // 不相等则继续循环链表B
                B = B.next;
            }
            // 单次循环结束,A链表前移
            A = A.next;
        }
        return null;
    }
}

Complejidad temporal: O (mn), m es la longitud de la lista enlazada A, n es la longitud de la lista enlazada B.
Complejidad espacial: O (1)

 

Solución 2: tabla hash

Recorra los elementos de la lista vinculada A, consulte los elementos almacenados en el HashMap y
recorra la lista vinculada B, verifique si el elemento existe en el HashMap a su vez, devuelva si existe y devuelva nulo al final del recorrido

public class Solution {
    
    
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
        if (null == headA || null == headB) return null;

        HashMap<ListNode, Integer> map = new HashMap<>();

        // 将链表A中数据存入map中
        while (null != headA){
    
    
            map.put(headA, headA.val);
            headA = headA.next;
        }
        // 遍历链表B,在map中查找是否存在,若存在则返回该结点
        while (null != headB){
    
    
            if (map.containsKey(headB)){
    
    
                return headB;
            }
            headB = headB.next;
        }
        // 链表B遍历结束,返回null
        return null;
    }
}

Complejidad temporal: O (m + n), m es la longitud de la lista enlazada A, n es la longitud de la lista enlazada B.
Complejidad espacial: O (m) u O (n)

 

Solución 3: puntero doble

La idea de esta solución es:
A y B dos listas vinculadas tienen longitudes diferentes. Si las dos listas vinculadas tienen una intersección, la distancia recorrida cuando se cruzan es la misma
, es decir, A + B = B + A, por lo que la travesía A + B y la travesía B + A deben Está terminando al mismo tiempo

public class Solution {
    
    
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
    
        if (headA == null || headB == null) return null;

        ListNode A = headA, B = headB;
        // 当没有相交时循环
        while (A != B) {
    
    
            // 链表A到达末尾时,使链表A指向headB的头结点,否则前移
            A = A == null ? headB : A.next;
            // 链表B到达末尾时,使链表B指向headA的头结点,否则前移
            B = B == null ? headA : B.next;
        }
        // 两个链表没有交点时,会一起到达终点,都为null
        return A;
    }
}

Complejidad temporal: O (m + n), m es la longitud de la lista enlazada A, n es la longitud de la lista enlazada B.
Complejidad espacial: O (1)

Supongo que te gusta

Origin blog.csdn.net/xrrrrrrrrrrr/article/details/112979066
Recomendado
Clasificación