【问题标题】:Sum two Linked Lists对两个链表求和
【发布时间】:2021-06-21 05:08:23
【问题描述】:

我有一个这样的节点:

struct ListNode {
    int val;
    ListNode *next;
    ListNode() 
       : val(0), next(nullptr) {}
    ListNode(int x) 
       : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) 
       : val(x), next(next) {}
};

我想使用递归对两个链接列表求和。我不确定,但我猜是尾递归。

输入: l1 = [2,4,3], l2 = [5,6,4]

输出: [7,0,8]

解释: 342 + 465 = 807。

这是我的代码:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2, int carry = 0,ListNode *result = nullptr) {
    int n1 = l1 != nullptr ? l1->val : 0;
    int n2 = l2 != nullptr ? l2->val : 0;
    int val = (n1 + n2 + carry) % 10;
    if(result == nullptr){
        result = new ListNode(val);
    }else{
        result->next = new ListNode(val);
        result = result->next;
    }
    result = addTwoNumbers(l1->next != nullptr ? l1->next : nullptr,
                           l2->next != nullptr ? l2->next : nullptr, 
                           (n1 + n2 + carry) - 10,result);
    return result;
}

但我遇到了分段错误,即使传递了两个单节点列表:

ListNode * a = new ListNode(1);
ListNode * b = new ListNode(2);
ListNode * c = addTwoNumbers(a, b); 
std::cout << c->val << "\n";

我看不出有什么问题,它应该可以工作。我错过了什么?

【问题讨论】:

  • 请发送minimal reproducible example。您的错误可能出在链表本身的构造中。另外,请添加您收到的确切运行时错误消息。

标签: c++ recursion linked-list runtime-error tail-recursion


【解决方案1】:

有几个问题:

  • 你的递归永远不会停止,这就是分段错误的原因——在递归调用中你评估l1-&gt;next,但在某个点l1将是一个空指针,所以你得到了异常。缺少所谓的递归“基本情况”。当两个列表指针都为空且没有进位时,不应该递归调用,而是应该返回一个空指针
  • (n1 + n2 + carry) - 10 是错误的公式。应该是(n1 + n2 + carry) / 10
  • result = result-&gt;next; 是错误的,因为您将永远失去对刚刚创建的节点的引用。创建新列表的头部后,该头部不需要再次更改。当您first 将参数的头值加在一起时,该总和也应该在结果中first 出现,并且对该第一个节点的引用是函数应该返回的内容。

还有:

  • 不必将result 作为参数传递。确保递归调用为您作为参数传递的较短列表返回一致的结果(链表)。然后,您要做的“唯一”事情就是将当前总和作为节点添加到该返回列表中预先添加,然后就完成了。所以result 参数确实不需要。

以下是更正后的代码:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2, int carry = 0) {
    // base case
    if (l1 == nullptr && l2 == nullptr && carry == 0) return nullptr;
    int n1 = l1 != nullptr ? l1->val : 0;
    int n2 = l2 != nullptr ? l2->val : 0;
    int sum = n1 + n2 + carry;
    return new ListNode(sum % 10, 
        addTwoNumbers(l1 != nullptr ? l1->next : nullptr, 
                      l2 != nullptr ? l2->next : nullptr, sum / 10));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多