题号0002 两数相加
题目地址 https://leetcode-cn.com/problems/add-two-numbers/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题目目的很明确,就是模拟一个加法器:创造一个每个位数相加,公共进位变量,步进到下一位再累和计算。
- 第一次提交:
Step 1 分别定义两个节点指向各自的链表头部
Step 2 直到2个节点都非空才退出,不停求当前链表节点val的累和,再加上进位。
Step 3 更新返回结果链表[插入(累和 % 10)节点];更新进位变量[累和 / 10];更新链表指向节点;
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* root = new ListNode(-1);
int iAccerValue = 0;
ListNode* pAdd1 = l1;
ListNode* pAdd2 = l2;
ListNode* p = root;
while (pAdd1 && pAdd2) {
auto iAddNum = pAdd1->val + pAdd2->val;
iAddNum += iAccerValue;
auto pResNode1 = new ListNode(iAddNum % 10);
iAccerValue = iAddNum / 10;
p->next = pResNode1;
p = pResNode1;
pAdd1 = pAdd1->next;
pAdd2 = pAdd2->next;
}
return root->next;
}
};
结果错误用例:[5] [5]
恍然明白自己错误将两个链表定义成n位+n位 还是n位的错误;
2.于是二次提交
增加了进位是否为0的判断
class Solution {
public:
...
while (pAdd1 && pAdd2 || iAccerValue) {
auto iAddNumSum = 0;
if(pAdd1 && pAdd2)
{
iAddNumSum = pAdd1->val + pAdd2->val;
pAdd1 = pAdd1->next;
pAdd2 = pAdd2->next;
}
...
}
};
错误用例:[1, 8] [0]
发现位数也可能不是等长的
- 三次提交
只要(加数链表节点不空 || 被加数链表节点不空 || 进位不为0) 就继续累和;不存在的加数和被加数链表节点,使用0作为累和的加数或被加数
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* root = new ListNode(-1);
int iAccerValue = 0;
ListNode* pAdd1 = l1;
ListNode* pAdd2 = l2;
ListNode* p = root;
while (pAdd1 || pAdd2 || iAccerValue) {
auto iAddNumSum = 0;
auto iAdd1 = 0;
auto iAdd2 = 0;
if(pAdd1)
{
iAdd1 = pAdd1 ? pAdd1->val : 0;
pAdd1 = pAdd1->next;
}
if(pAdd2)
{
iAdd2 = pAdd2 ? pAdd2->val : 0;
pAdd2 = pAdd2->next;
}
iAddNumSum = iAdd1 + iAdd2 + iAccerValue;
auto pResNode1 = new ListNode(iAddNumSum % 10);
iAccerValue = iAddNumSum / 10;
p->next = pResNode1;
p = pResNode1;
}
return root->next;
}
};
Github地址:https://github.com/saberqueen/LeetingCodeExcise.git