Sich überschneidende verknüpfte Listen: Eine kleine Überlegung zur Lösung des K-Gott-Problems

Thema:

Suchen Sie anhand der Kopfknoten headA und headB zweier einfach verknüpfter Listen den Startknoten, an dem sich die beiden einfach verknüpften Listen schneiden, und geben Sie ihn zurück. Wenn zwischen den beiden verknüpften Listen kein Schnittpunkt vorhanden ist, wird null zurückgegeben.

Die Abbildung zeigt, dass sich die beiden verknüpften Listen am Knoten c1 zu überschneiden beginnen:
Fügen Sie hier eine Bildbeschreibung ein
Die Fragedaten stellen sicher, dass es in der gesamten verknüpften Struktur keinen Zyklus gibt.

Naive Lösung

Verwenden Sie einen Hash, um das Schlüssel-Wert-Paar (Adresse, Anzahl der Vorkommen) zu speichern, die beiden verknüpften Listen zu durchlaufen und den ersten Knoten mit der Anzahl der Vorkommen 2 zu finden.

class Solution {
    
    
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    
    
        map<ListNode*, int> numNode;
        ListNode *cur = headA;
        while(headA != nullptr){
    
    
            numNode[headA]++;
            headA = headA->next;
        }
        while(headB!= nullptr) {
    
    
            numNode[headB]++;
            headB = headB->next;
        }
        while(cur != nullptr){
    
    
            if(numNode[cur] > 1) return cur;
            cur = cur->next;
        }
        return nullptr;
    }
};

K Gott Lösung

Doppelzeiger durchlaufen abwechselnd die beiden verknüpften Listen, bis sich die beiden Zeiger treffen. Das Prinzip besteht darin, dass die Enden der beiden verknüpften Listen verbunden sind, zum Beispiel
Liste A: [1, 2, 3, 7, 8, 9]
Liste B: [4, 5, 7, 8, 9]

Zwei verknüpfte Listen verbinden (die Listen durch 0 trennen)

AB-Tabelle: [1, 2, 3, 7, 8, 9, 0, 4, 5, 7, 8, 9, 0] BA-Tabelle: [4, 5, 7, 8, 9, 0, 1, 2
, 3, 7, 8, 9, 0]

Die sich überschneidenden Teile der beiden Tabellen werden nach der Verbindung am Ende ordentlich angeordnet. Wenn kein sich überschneidender Knoten vorhanden ist, wird am Ende ein Nullwert zurückgegeben.

class Solution {
    
    
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    
    
        ListNode *A = headA, *B = headB;
        while (A != B) {
    
    
            A = A != nullptr ? A->next : headB;
            B = B != nullptr ? B->next : headA;
        }
        return A;
    }
};

Gefühl

Lassen Sie uns am Ende dieser Idee nicht über die clevere Verwendung derselben Merkmale sprechen. Sprechen wir über die Cleverness des letzten Codes. Ich war eine Weile fassungslos. Er verwendet den ternären Operator, um Werte zu beurteilen und zuzuweisen, und vervollständigt den Austausch ohne Spleißen. Die Schleife kann so geschrieben werden. Ich bin verloren. , was mich sehr zum Seufzen brachte und ich konnte nicht anders, als zu klagen und an mir selbst zu zweifeln.
Als ich diese Frage zum ersten Mal stellte, tat ich es nicht Ich kenne nicht einmal den Hash-Code von Blind CV. Nachdem ich die Lösung gelesen hatte, dachte ich, ich wüsste es.
Auch wenn ich mich beim zweiten Mal überhaupt nicht an diese Frage erinnerte, lernte ich Hashing, also habe ich es gemacht und gesagt, dass ich es kann Ich habe nur einen Blick auf die wunderbare Lösung geworfen.
Als ich dieses Problem zum dritten Mal löste, wusste ich in meinem Kopf, dass es eine bessere Methode namens schnelle und langsame Zeiger oder Doppelzeiger zu geben schien. Sie war sehr vage. Dann habe ich Hashing verwendet ohne irgendwelche Fortschritte zu machen. Erst als ich die Lösung des Problems gelesen und selbst im Kommentarbereich darüber nachgedacht habe, wurde mir klar, dass die spezifische und bessere Methode diese ist. Ich habe dieses Problem schon einmal gelöst, und es ist erst das zweite Das Beste. Diese Art von genialer und
exquisiter Idee. Ich bin mir nicht sicher, ob ich mir den Code selbstständig ausdenken und eintippen kann, um ihn umzusetzen ...

Ein Teil der Erklärung und des Verständnisses stammt vom Meister im Kommentarbereich, und die einfache Lösung und der Code stammen von Einzelpersonen.

おすすめ

転載: blog.csdn.net/BinBinCome/article/details/132645752