思路:这道题需要注意的的点就是进位,两个数相加后如果产生进位,就要在下一位相加时添加上1,这里用addition这个变量储存,如果产生进位,addition=1,加在下一个数上
另外就是补位问题,如果两个数位数不同,对较短的链表补位,方便下面相加。
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int length1=1, length2=1;
ListNode* q1=l1;//统计l1的长度
ListNode* q2 = l2;//统计l2的长度
while (q1->next != nullptr)
{
length1++;
q1 = q1->next;
}
while (q2->next != nullptr)
{
length2++;
q2 = q2->next;
}
if (length1 > length2)//给没有对齐的位补零
{
for (int i = length2; i <= length1; i++)
{
q2->next = new ListNode(0);
q2 = q2->next;//每增加一个节点都要往后移动一位
}
}
else {
if (length1 < length2)
{
for (int i = length1; i < length2; i++)
{
q1->next = new ListNode(0);
q1 = q1->next;
}
}
}
q1 = l1;
q2 = l2;
//创建一个新的链表,用来储存答案
bool addition = false;
ListNode* l3 = new ListNode(-1);
ListNode* cur = l3;
while (q1 && q2)
{
int temp = addition + q1->val + q2->val;
cur->next = new ListNode(temp % 10);//将个位的数字放入节点
addition = temp / 10;
//将每个节点往后移
q1 = q1->next;
q2 = q2->next;
cur = cur->next;
}
if (addition)//最后一位相加时产生的进位
{
cur->next = new ListNode(1);
cur = cur->next;//节点后移
}
return l3->next;//取头节点往下的节点
}
};