所以我正在练习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]
我知道有一种更聪明的方法来解决这个问题,但我想先尝试以自己的方式解决
答案 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)
您获得额外的零,因为您执行remainder
和division
的操作比要求的时间多了1倍。您必须在最后一个while
循环下修改条件。
while (sum3 > 9) {
int extract = sum3 % 10;
l0->next = new ListNode(extract);
sum3 /= 10;
l0=l0->next;
}