ein c-Programm zum hinzufügen von zwei einfach verketteten Listen, der ungleiche Längen, mit Einzel-digited zahlen in all Ihren Knoten
bekam ich dies als eine interview-Frage. ich bekam 2 verbundene Listen unterschiedlicher Länge,die einen einzigen digited Anzahl in jedem Ihrer Knoten. ich wurde gebeten, zu bauen, ein 3. Link-Liste enthält die Summe der beiden verknüpften Listen, wieder in die form 1-stellig in einem Knoten.
ex:
verknüpfte Liste 1 ist
4-7-9-6
verknüpfte Liste 2 ist
5-7
dann den 3. Link-Liste wäre
4-8-5-3
kann jemand mir empfehlen ein effizienter Algorithmus, mit minimalen Kompromiss in Bezug auf die Raum-Komplexität?(ich erwarte nicht, einen algo dat beinhaltet die Umkehrung der Listen mehrfach).
- In welcher Weise ist die Summe der 4-7-9-6 und 5-7 gleich 4-8-5-3?
- Ich habe keine Ahnung. Ich war zunächst zu Bedenken, dass es möglicherweise ein Fall der Anpassung der enden der Listen und nehmen Summen mod 10, aber dann das Ergebnis gewesen wäre, habe 4-7-4-3.
- Ich denke, Sie sind nur ganze zahlen, dargestellt als Liste von Ziffern, so ist es 4796 + 57 = 4853 ?
- ya, paul. das ist genau das, was ich meinte. tut mir Leid nicht klar damit.
- Ich Gefahr, zu erraten, dass die richtige Antwort auf die interview-Frage: "ist die Liste mit Einzel-oder Doppel-verbunden?"
- Seit der OP erwähnt, die Umkehrung der Listen, ich gehe davon aus einzeln miteinander verknüpft.
- es würde sehr einfach sein, wenn es eine doppelt verkettete Liste. seine eine einfach verknüpfte Liste.
- Vielleicht war es eine gute Idee zu Fragen, "Warum nicht halten Sie Umgekehrt die ganze Zeit?"
Du musst angemeldet sein, um einen Kommentar abzugeben.
die Aufrechterhaltung eines zu tragen), die die
Ergebnisse in einer Liste 3, die Sie
konstruieren von Schwanz zu Kopf
ODER
int list1AsInt = 0; For each node {list1AsInt *= 10; list1AsInt += valueOfThisNode;}
)valueOfBrandNewNode = list3AsInt % 10; list3AsInt /= 10; Add a new node that points to the prev one;
)ODER
Ihre Längen. Für dieses Beispiel
nehmen wir an, dass Liste 1 mehr
von N Knoten.
ohne trägt und eine Liste mit 4 bis
repräsentieren Sie die trägt.
kopieren Sie diese Werte in Liste 3 und machen Sie
Liste 4 die Werte 0 sein.
und 2, sum-element-by-element,
putting die Summe mod 10 in Liste 3 und
die tragen sich in Liste 4. Verfolgen über
ein boolescher Wert, ob Liste 4 alle 0.
4.
Else recurse Sie zu Schritt 2,
Behandlung von Liste 3 als
die neue Liste 1 und Liste 4 als die neue
Liste 2. Wir wissen, die Länge der
neue Liste 1 ist der größere der Längen
die alten Listen 1 und 2, und die Länge
von der neuen Liste 2 ist ein mehr als das.
atoi()
- Funktion auf beiden char-arrays ( Sie können mitatol()
oderatoll()
wenn Sie sind besorgt über die Länge)itoa()
Funktion zum umwandeln in ein char-array & dann wieder in die neue Liste.Obwohl, ich gebe zu, die
itoa()
Funktion ist nicht standard.Wenn die Listen doppelt verkettete es ist ganz einfach:
Die Lösung könnte sein, viel einfacher, wenn die Liste gespeichert werden die zahlen in umgekehrter Reihenfolge.
Dennoch mit der gegebenen Einschränkung, hier ist ein Ansatz.
n = 0
,node
mit der Summe der Ziffern,carry
,insert
den neu erstellten Knoten an diehead of
dieresult
ListeFolgenden ist der (ungeprüfte) C-code.
Werfen Sie einen Blick auf diese code:
Ist dies einleuchtend. Vorausgesetzt, die Knoten ganz Links ist der bedeutendste bit. Richten Sie die beiden Listen, hinzufügen und propagieren tragen. Nach der Rückkehr erstellen Sie einen neuen Knoten, wenn nötig.