2016-12-06 112 views
-1

我给出了两个表示两个非负数的链表。数字以相反的顺序存储,每个节点都包含一个数字。我必须编写一个代码,将两个数字相加并将其作为链接列表返回(也按相反的顺序)。为什么我的代码导致运行时错误?

我写了下面的代码。只要最后一位数字不是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

取得本地变量的地址是灾难(&last)的配方。在声明的范围之外,它将是无效的 – crashmstr

+3

你是否真的认为在子例程退出到链表尾部时添加一个指向局部变量的指针是个好主意? – infixed

回答

0

您至少有两个明显的错误。 首先,没有保证,只要我至少可以看到,在prev

prev->next = &last; 

不为NULL。这是你算法的逻辑错误。 第二个,您正在将一个本地对象last添加到链接列表中。相反,您应该使用new分配新的ListNode,例如

assert(prev);  // must not be NULL 
prev->next = new ListNode(1); 
相关问题