2016-12-06 2 views
-1

Ich habe zwei verkettete Listen, die zwei nicht negative Zahlen darstellen. Die Ziffern werden in umgekehrter Reihenfolge gespeichert und jeder ihrer Knoten enthält eine einzelne Ziffer. Ich muss einen Code schreiben, der die beiden Zahlen addiert und als verkettete Liste zurückgibt (in umgekehrter Reihenfolge).Warum führt mein Code zu einem Laufzeitfehler?

Ich habe den folgenden Code geschrieben. Es funktioniert gut, solange die letzte Ziffer nicht 9 ist. Es sieht so aus, als ob es ein Speicherzuweisungsproblem ist, aber ich kann nicht herausfinden, was.

Kann jemand vorschlagen, was falsch ist und wie man es repariert?

/** 
* Definition for singly-linked list. 
* struct ListNode { 
*  int val; 
*  ListNode *next; 
*  ListNode(int x) : val(x), next(NULL) {} 
* }; 
*/ 

void adder(int &value, bool &carry) { 
    if(carry) value++; 
    if (value > 9) { 
     value = value%10; 
     carry = true; 
    }else carry = false; 
} 

class Solution { 
public: 
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 
     ListNode* prev = NULL; 
     bool carry = false; 
     ListNode* curr1 = l1; 
     ListNode* curr2 = l2; 
     ListNode* worker = NULL; 

     while(curr1 != NULL && curr2 != NULL){ 
      curr1 = curr1->next; 
      curr2 = curr2->next; 
     } 

     if(curr1 != NULL) worker = l1; 
     else worker = l2; 

     ListNode* result = worker; 
     curr1 = l1; 
     curr2 = l2; 

     while(curr1 != NULL && curr2 != NULL) { 
      int value = curr1->val + curr2->val ; 
      adder(value, carry); 
      worker->val = value; 
      //cout<<curr1->val<<endl; 
      curr1 = curr1->next; 
      curr2 = curr2->next; 
      prev = worker ; 
      worker = worker->next; 
     } 

     while(worker != NULL && carry) { 
      int value = worker->val; 
      adder(value, carry); 
      worker->val = value; 
      prev = worker; 
      worker = worker->next; 
     } 

     ListNode last(1); 

     //the following line results in runtime error 
     if(carry) { 
      prev->next = &last; 
     } 

     return result; 

    } 
}; 
+7

Das richtige Tool, um dies herauszufinden, ist Ihr Debugger. Zum allerletzten konnte man feststellen, welche Zeile den Fehler verursacht – UnholySheep

+1

Die Adresse einer lokalen Variablen zu nehmen ist ein Rezept für ein Desaster (& last). Es wird ungültig außerhalb des Gültigkeitsbereichs, in dem es erklärt wird – crashmstr

+3

Glauben Sie wirklich, dass es eine gute Idee ist, einen Zeiger zu einer lokalen Variable hinzuzufügen, die weggeht, wenn die Unterroutine zum Ende einer verknüpften Liste hinausgeht? – infixed

Antwort

0

Sie haben mindestens zwei offensichtliche Fehler. Erste, gibt es keine Garantie, soweit ich das zumindest sehen, dass prev in

prev->next = &last; 

ist nicht NULL. Dies ist ein Fehler in der Logik Ihres Algorithmus. Zweite, fügen Sie ein lokales Objekt last zu der verknüpften Liste hinzu. Stattdessen sollten Sie einen neuen ListNode unter Verwendung new z.

assert(prev);  // must not be NULL 
prev->next = new ListNode(1); 
Verwandte Themen