我的输出中有一个额外的0,为什么

时间:2018-10-09 14:19:51

标签: c++

所以我正在练习leetcode,这是一个问题:

您将获得两个非空链表,它们代表两个非负数 整数。数字以相反的顺序存储,并且它们的每个节点 包含一个数字。将两个数字相加,然后将其作为链表返回。

您可以假定两个数字不包含任何前导零,除了 数字0本身。

示例:

输入:(2-> 4-> 3)+(5-> 6-> 4)

输出:7-> 0-> 8

说明:342 + 465 = 807。

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

这是我的解决方案:

class Solution {
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
    vector<int> V1;
    vector<int> V2;
    int sum1 = 0;
    int sum2 = 0;
    ListNode *result = new ListNode(0);
    auto l0 = result;
    while(l1) {
        V1.push_back(l1->val);
        l1=l1->next;
    }

    for (auto it1 = V1.rbegin(); it1 != V1.rend(); it1++) {
        sum1 = sum1 * 10 + (*it1);
    }

    while(l2) {
        V2.push_back(l2->val);
        l2=l2->next;
    }

    for (auto it2 = V2.rbegin(); it2 != V2.rend(); it2++) {
        sum2 = sum2 * 10 + (*it2);
    }
    int sum3 = sum1 + sum2;
    while (sum3 !=0) {
        int extract = sum3 % 10;
        l0->next = new ListNode(extract);
        sum3 /= 10;
        l0=l0->next;
    }

    return result;


}
};

当我运行它时,输出中总是有多余的0,例如:

您的输入 [7,2,7] [2,4,2]

您的答案 [0,9,6,9]

预期答案 [9,6,9]

我知道有一种更聪明的方法来解决这个问题,但我想先尝试以自己的方式解决

2 个答案:

答案 0 :(得分:1)

这是因为您要创建的第一个节点为0。为此您有两种解决方案:

  • 在功能末尾跳过第一个元素(解决方法):

    ListNode* aux = result;
    result = result->next;
    delete aux;
    return result;
    
  • 未将listnode初始化为零,请改用空指针:

s

ListNode *result = nullptr;

// More code...

while (sum3 !=0) {
    int extract = sum3 % 10;
    if (l0 == nullptr) {
        result = new ListNode(extract);
        l0 = result;
    }
    else
        l0->next = new ListNode(extract);
    sum3 /= 10;
    l0=l0->next;
}

Ofc,有更好的解决方案。您可以直接进行求和,而无需使用额外的向量/内存。

答案 1 :(得分:0)

您获得额外的零,因为您执行remainderdivision的操作比要求的时间多了1倍。您必须在最后一个while循环下修改条件。

while (sum3 > 9) {
    int extract = sum3 % 10;
    l0->next = new ListNode(extract);
    sum3 /= 10;
    l0=l0->next;
}