#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
};
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* l3 = new ListNode;
ListNode* l4 = l3;
int m = 0;//进位值
while (l1 || l2)
{
if (l1 != NULL && l2 != NULL)
{
l3->val = (l1->val + l2->val + m) % 10;
m = (l1->val + l2->val + m) / 10;
l1 = l1->next;
l2 = l2->next;
}
else if (l1 != NULL)//l1非空,l2空
{
l3->val = (l1->val + m) % 10;
m = (l1->val + m) / 10;
l1 = l1->next;
}
else if (l2 != NULL)//l1空,l2非空
{
l3->val = (l2->val + m) % 10;
m = (l2->val + m) / 10;
l2 = l2->next;
}
if (l1 != NULL || l2 != NULL)//两个均为空
{
l3->next = new ListNode();
l3 = l3->next;
}
else //两表为空但仍有进为,则仍需开辟一个新的空间将进位值添上
{
l3->next = new ListNode(m);
}
}
return l4;
}
};
在涉及到加减法进借位时,应该用一个辅助变量/10取得进为数,%10取得进位后的余数。为了节省时间,应该考虑减少循环的使用,即用 l1||l2不为空作为非空条件,然后再在其中分类讨论。注意指针的移动,以及新开辟指针的扩容。