Das GIF-Bild zeigt die Begegnung von Algorithmen

Vorwort

Heute werde ich Ihnen ein Problem vorstellen, das nicht so schwierig ist. Es gibt viele Möglichkeiten, dieses Problem zu lösen. Solange Wechselstrom eine gute Methode ist, obwohl das Problem nicht besonders schwierig ist, handelt es sich auch um ein klassisches Problem im Angebot. Denken Sie also daran, dies zu tun. Dann ist heute unser Abschnitt mit verknüpften Listen vorbei. Am Wochenende werde ich eine Zusammenfassung des Themas der verknüpften Liste machen. Okay, rede keinen Unsinn, lass uns einen Blick auf das heutige Thema werfen

Titel Beschreibung:

Geben Sie die beiden verknüpften Listen ein und suchen Sie ihren ersten gemeinsamen Knoten. Kehren Sie einfach wie unten gezeigt zum gelben Knoten zurück.

Fügen Sie hier eine Bildbeschreibung ein

Ist der Themenausdruck sehr einfach? Ich habe zwei Methoden für dieses Thema: Eine ist die Verwendung von HashSet für die Speicherung und die andere die Verwendung von Doppelzeigern. Wenn Sie eine bessere haben, können Sie diese unten diskutieren.

HashSet

Diese Methode ist relativ einfach. Die Hauptidee besteht darin, zuerst eine verknüpfte Liste zu durchlaufen und alle Werte der verknüpften Liste in der Hash-Tabelle zu speichern und dann eine andere verknüpfte Liste zu durchlaufen. Wenn wir feststellen, dass bereits ein Knoten in der Hash-Tabelle vorhanden ist, dann wir Kehren Sie einfach direkt zum Knoten zurück, und der Code ist sehr einfach.

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;
        
    }
}

Die folgende Methode ist genialer, es ist nicht besonders leicht zu denken, Sie können sie selbst implementieren, diese Methode verwendet auch unser Dual-Pointer-Denken.

Schauen wir uns die Animation direkt unten an, die sehr intuitiv ist und auf einen Blick verstanden werden kann.
Fügen Sie hier eine Bildbeschreibung ein

Verstehen Sie es sofort? Wir verwenden Doppelzeiger. Nachdem ein Zeiger die verknüpfte Liste durchlaufen hat, drehen Sie sich zum Kopf der anderen verknüpften Liste und fahren Sie mit dem Durchlaufen fort. Weil die Geschwindigkeit gleich ist, werden sie sich definitiv beim zweiten Durchgang treffen, ist es nicht romantisch?

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;        
    }
}

Okay, die Frage der verknüpften Liste ist vorbei. Ich hoffe, jeder kann etwas gewinnen. Ich werde den neuen Fragetyp nächste Woche aktualisieren. Wenn Sie weiterhin bestehen, werden Sie definitiv gewinnen.

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/tan45du_yuan/article/details/109389370
Empfohlen
Rangfolge