Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的输出中有一个额外的0,为什么_C++ - Fatal编程技术网

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

C++ 我的输出中有一个额外的0,为什么,c++,C++,所以我在做leetcode的练习,问题是: 给您两个非空的链表,表示两个非负 整数。数字按相反顺序存储,每个节点 包含一个数字。将这两个数字相加,并将其作为链表返回 您可以假设这两个数字不包含任何前导零,除了 数字0本身 例如: 输入:(2->4->3)+(5->6->4) 输出:7->0->8 说明:342+465=807 /** * Definition for singly-linked list. * struct ListNode { * int val; *

所以我在做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;


}
};
类解决方案{
公众:
ListNode*AddTwoNumber(ListNode*l1,ListNode*l2){
向量V1;
矢量V2;
int sum1=0;
int-sum2=0;
ListNode*result=新的ListNode(0);
自动l0=结果;
while(l1){
V1.推回(l1->val);
l1=l1->next;
}
对于(自动it1=V1.rbegin();it1!=V1.rend();it1++){
sum1=sum1*10+(*it1);
}
while(l2){
V2.推回(l2->val);
l2=l2->next;
}
对于(自动it2=V2.rbegin();it2!=V2.rend();it2++){
sum2=sum2*10+(*it2);
}
int sum3=sum1+sum2;
while(sum3!=0){
int extract=sum3%10;
l0->next=新建列表节点(提取);
sum3/=10;
l0=l0->next;
}
返回结果;
}
};
当我运行它时,我的输出中总是有额外的0,例如:

你的意见 [7,2,7][2,4,2]

你的回答 [0,9,6,9]

预期答案 [9,6,9]


我知道有一个更聪明的方法来解决这个问题,但我想先用我的方法来解决它

你得到了一个额外的零,因为你做的是
余数
除法
操作比要求的多了一倍。您必须在上次
while
循环下修改条件

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

这是因为您正在使用0创建第一个节点。您有两种解决方案:

  • 跳过函数末尾的第一个元素(变通方法):

  • 如果不将listnode初始化为零,请改用空指针:


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

欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:SO通常不欢迎代码截图或输出的链接。请把课文放在问题的主体部分。GDB对C++程序非常有用,可以帮助你调试这样的事情。这也是一件非常好的事情。您可能不喜欢使用新的ListNode(0)来初始化结果变量。假设你知道它总是从0开始,所以不要输出它。初始化列表的虚拟节点可以生成更简单的代码,因为您不必测试null,也不必更新列表头。调试它的最佳方法是从1+1开始。
ListNode* aux = result;
result = result->next;
delete aux;
return result;
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;
}