2016-12-06 6 views
-1

2つの非負の数値を表す2つのリンクリストが与えられました。数字は逆の順序で格納され、ノードのそれぞれには1桁の数字が含まれます。私は2つの数字を追加し、それを逆順でリンクリストとして返すコードを書く必要があります。私のコードがランタイムエラーになるのはなぜですか?

私は次のコードを書いています。最後の数字が9でない限り正常に動作します。メモリ割り当ての問題のようですが、何が分かりませんか。

誰でも何が間違っているのか、それを修正する方法を提案できますか?

/** 
* 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

これを理解するために使用する適切なツールは、デバッガです。最後にエラーを引き起こす行を特定することができます – UnholySheep

+1

ローカル変数のアドレスを取ることは、災害(&最後)のためのレシピです。それが宣言されているスコープの外では無効になります – crashmstr

+3

サブルーチンがリンクされたリストの終わりに出るときに消え去っているローカル変数へのポインタを追加することをお勧めしますか? – infixed

答えて

0

少なくとも2つの明らかなエラーがあります。 まずは、prev

prev->next = &last; 

には非NULLであることを、私の知る限り、少なくとも見ることができるよう、保証はありません。これはアルゴリズムのロジックにエラーがあります。 第2のの場合は、ローカルオブジェクト lastをリンクリストに追加します。代わりに、 newを使用して新しい ListNodeを割り当てる必要があります。

assert(prev);  // must not be NULL 
prev->next = new ListNode(1); 
関連する問題