给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* l1_copy = l1;
ListNode* l2_copy = l2;
int l1_length = 0;
int l2_length = 0;
//计算l1链表的长度
for (;;)
{
l1_length++;
if (l1->next != NULL)
{
l1 = l1->next;
}
else
{
break;
}
}
//计算l2链表的长度
for (;;)
{
l2_length++;
if (l2->next != NULL)
{
l2 = l2->next;
}
else
{
break;
}
}
//将位数较少的链表用0补齐
if (l1_length > l2_length)
{
for (int i = 0; i < l1_length - l2_length; i++)
{
l2->next = new ListNode(0);
l2 = l2->next;
}
}
else
{
for (int i = 0; i < l2_length - l1_length; i++)
{
l1->next = new ListNode(0);
l1 = l1->next;
}
}
//指针归位
l1 = l1_copy;
l2 = l2_copy;
int result_num;
bool current_flag = 0; //这一位是否需要向下一位产生进位?
bool before_flag = 0; //上一位是否产生了进位?
ListNode* result = new ListNode(0);
ListNode* record = result;
for (;;)
{
before_flag = current_flag;
current_flag = 0;
result_num = l1->val + l2->val;
//是否向后产生进位
if (result_num >= 10)
{
current_flag = 1;
result_num = result_num % 10;
}
else
{
current_flag = 0;
result_num = result_num % 10;
}
//前一位是否产生了进位
if (before_flag == 1)
{
//当前一位产生了进位并且当前位相加的结果是9时
if (result_num + 1 >= 10)
{
//向后一位产生进位
current_flag = 1;
//当前位的数字为0
result->next = new ListNode(0);
result = result->next;
}
else
{
result->next = new ListNode(result_num + 1);
result = result->next;
}
}
else
{
result->next = new ListNode(result_num);
result = result->next;
}
if (l1->next == NULL || l2->next == NULL)
{
break;
}
else
{
l1 = l1->next;
l2 = l2->next;
}
}
//for循环结束后判断是否最后计算的一位产生了进位
if (current_flag == 1)
{
result->next = new ListNode(1);
result = result->next;
}
return record->next;
}
};
总结:使用两个标志位来判断是否当前位需要向下进位和上一位是否产生进位,两个链表在计算之前需要补齐