La imagen GIF muestra el encuentro de algoritmos.

Prefacio

Hoy les traeré un problema que no es tan difícil. Hay muchas formas de responder a este problema. Siempre que la CA sea un buen método, aunque el problema no sea particularmente difícil, también es un problema clásico en la oferta, así que recuerde ingresar. Entonces hoy nuestra sección de lista vinculada ha terminado. El fin de semana haré un resumen del tema de la lista enlazada. De acuerdo, no digas tonterías, veamos el tema de hoy

Descripción del Título:

Ingrese a las dos listas vinculadas y encuentre su primer nodo común. Simplemente regrese al nodo amarillo como se muestra a continuación.

Inserte la descripción de la imagen aquí

¿La expresión del tema es muy simple? Tengo dos métodos para este tema. Uno es usar HashSet para el almacenamiento y el otro es usar punteros dobles. Si tiene uno mejor, puede discutirlo a continuación.

HashSet

Este método es relativamente simple. La idea principal es recorrer primero una lista vinculada y almacenar todos los valores de la lista vinculada en la tabla hash, y luego recorrer otra lista vinculada. Si encontramos que ya existe un nodo en la tabla hash, entonces Simplemente regrese al nodo directamente y el código es muy simple.

public class Solution {
    
    
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
        ListNode tempa = headA;
        ListNode tempb = headB;
        //定义hash表
        HashSet<ListNode> arr = new HashSet<ListNode>();
        while(tempa!=null){
    
    
            arr.add(tempa);
            tempa=tempa.next;
        }
        while(tempb!=null){
    
    
            if(arr.contains(tempb)){
    
    
                return tempb;
            }
            tempb=tempb.next;
        }
        return tempb;
        
    }
}

El siguiente método es más ingenioso, no es particularmente fácil de pensar, puede implementarlo usted mismo, este método también utiliza nuestro pensamiento de puntero dual.

Veamos la animación directamente debajo, que es muy intuitiva y se puede entender de un vistazo.
Inserte la descripción de la imagen aquí

¿Lo entiende de un vistazo? Usamos punteros dobles, después de que un puntero atraviesa la lista vinculada, luego damos la vuelta para ir al encabezado de la otra lista vinculada y continuar atravesando. Debido a que la velocidad es la misma, definitivamente se encontrarán durante el segundo recorrido, ¿no es romántico?

public class Solution {
    
    
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
        //定义两个节点
        ListNode tempa = headA;
        ListNode tempb = headB;
        //循环
        while(tempa!=tempb){
    
    
          //如果不为空就指针下移,为空就跳到另一链表的头部
           tempa = tempa!=null ? tempa.next:headB;
           tempb = tempb!=null ? tempb.next:headA;
        }
        return tempa;        
    }
}

Muy bien, la pregunta de la lista vinculada ha terminado. Espero que todos puedan ganar algo. Actualizaré el nuevo tipo de pregunta la semana que viene. Si continúas persistiendo, definitivamente ganarás.

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/tan45du_yuan/article/details/109389370
Recomendado
Clasificación