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