Dies ist eine Programmierfrage, die während eines schriftlichen Tests für ein Interview gestellt wurde. "Sie haben zwei einzeln verknüpfte Listen, die bereits sortiert sind. Sie müssen sie zusammenführen und den Kopf der neuen Liste zurückgeben, ohne neue zusätzliche Knoten zu erstellen. Die zurückgegebene Liste sollte ebenfalls sortiert werden."
Die Methodensignatur lautet: Node MergeLists (Node list1, Node list2);
Die Knotenklasse ist unten:
class Node{
int data;
Node next;
}
Ich habe viele Lösungen ausprobiert, aber keine zusätzlichen Knotenschrauben erstellt. Bitte helfen Sie.
Hier ist der dazugehörige Blogeintrag http://techieme.in/merging-two-sorted-singly-linked-list/
algorithm
singly-linked-list
Dharam
quelle
quelle
Antworten:
quelle
Eine Rekursion sollte nicht erforderlich sein, um die Zuweisung eines neuen Knotens zu vermeiden:
quelle
if (list1.next == null) list1.next = list2;
kann einfach seinlist1.next = list2;
. Da diewhile (list1.next != null)
Schleife gerade beendet wurde, können wir sicher sein, dasslist1.next == null
.quelle
Hier ist der Algorithmus zum Zusammenführen von zwei sortierten verknüpften Listen A und B:
Hier wird C die Ausgabeliste sein.
quelle
Schau ma, keine Rekursion!
quelle
Die Iteration kann wie folgt durchgeführt werden. Komplexität = O (n)
quelle
quelle
Dies kann ohne Erstellen des zusätzlichen Knotens erfolgen, wobei nur eine weitere Knotenreferenz an die Parameter übergeben wird (Knotentemperatur).
quelle
Ich möchte mitteilen, wie ich die Lösung dachte ... Ich sah die Lösung, die Rekursion beinhaltet und sie ist ziemlich erstaunlich, ist das Ergebnis eines gut funktionierenden und modularen Denkens. Ich schätze das Teilen sehr.
Ich möchte hinzufügen, dass die Rekursion bei großen Lits nicht funktioniert, die Stapelaufrufe überlaufen. Also habe ich beschlossen, den iterativen Ansatz auszuprobieren ... und das bekomme ich.
Der Code ist ziemlich selbsterklärend. Ich habe einige Inline-Kommentare hinzugefügt, um dies sicherzustellen.
Wenn Sie es nicht bekommen, benachrichtigen Sie mich bitte und ich werde die Lesbarkeit verbessern (vielleicht habe ich eine irreführende Interpretation meines eigenen Codes).
}}
quelle
Eine einfache iterative Lösung.
quelle
Ich zeige unten eine iterative Lösung. Eine rekursive Lösung wäre kompakter, aber da wir die Länge der Listen nicht kennen, besteht bei der Rekursion die Gefahr eines Stapelüberlaufs.
Die Grundidee ähnelt dem Zusammenführungsschritt bei der Zusammenführungssortierung. Wir behalten einen Zeiger, der jeder Eingabeliste entspricht. Bei jeder Iteration bewegen wir den Zeiger, der dem kleineren Element entspricht. Es gibt jedoch einen entscheidenden Unterschied, bei dem die meisten Menschen stolpern. Da bei der Zusammenführungssortierung ein Ergebnisarray verwendet wird, ist die nächste einzufügende Position immer der Index des Ergebnisarrays. Für eine verknüpfte Liste müssen wir einen Zeiger auf das letzte Element der sortierten Liste behalten. Der Zeiger kann von einer Eingabeliste zur nächsten springen, je nachdem, welches das kleinere Element für die aktuelle Iteration hat.
Damit sollte der folgende Code selbsterklärend sein.
quelle
Einfacher Code in Javascript zum Zusammenführen von zwei verknüpften Listen.
quelle
Verstehen Sie zunächst den Mittelwert von "ohne neue zusätzliche Knoten zu erstellen" . Soweit ich weiß, bedeutet dies nicht, dass ich keine Zeiger haben kann, die auf einen oder mehrere vorhandene Knoten verweisen.
Sie können dies nicht erreichen, ohne Zeiger auf vorhandene Knoten zu sprechen. Selbst wenn Sie die Rekursion verwenden, um dasselbe zu erreichen, erstellt das System Zeiger für Sie als Aufrufstapel. Es ist so, als würde man dem System sagen, dass es Zeiger hinzufügen soll, die Sie in Ihrem Code vermieden haben.
Einfache Funktion, um dasselbe mit zusätzlichen Zeigern zu erreichen :
quelle
In meinem Blogbeitrag finden Sie http://www.algorithmsandme.com/2013/10/linked-list-merge-two-sorted-linked.html
quelle
quelle
Hier ist ein vollständiges Arbeitsbeispiel, das die implementierte verknüpfte Liste java.util verwendet. Sie können den folgenden Code einfach kopieren und in eine main () -Methode einfügen.
quelle
Rekursiver Weg (Variante der Stefan-Antwort)
Betrachten Sie die unten stehende verknüpfte Liste, um dies zu veranschaulichen
2>4
Liste A1>3
Liste B.Fast dieselbe Antwort (nicht rekursiv) wie Stefan, jedoch mit wenig mehr Kommentaren / aussagekräftigem Variablennamen. Auch doppelt verknüpfte Liste in Kommentaren abgedeckt, wenn jemand interessiert ist
Betrachten Sie das Beispiel
5->10->15>21 // List1
2->3->6->20 //List2
quelle
Ich nehme die Frage wie folgt an:
Pseudocode:
Code:
quelle
quelle
quelle
:) GlbMP
quelle
quelle
Ich habe am Anfang nur einen Dummy-Knoten erstellt, um mir viele Wenn-Bedingungen zu ersparen.
quelle
quelle
quelle
Hier ist der Code zum Zusammenführen von zwei sortierten verknüpften Listen headA und headB:
quelle