日野弥生:勉強しよう
LeetCode 2 - 两数相加
发表于2025年01月27日
由于两数相加,需要考虑进位、进位后的位数相加需要加1、进位后末尾新增结点、两数长度不同的情况。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *curr1 = l1, *curr2 = l2, *prev1 = nullptr, *prev2 = nullptr;
/* 进位标记 */
bool isAdd = false;
/* 两数链表都到空指针时,退出循环 */
while(curr1 || curr2)
{
/* 两数在该位上都有数字 */
if(curr1 && curr2)
{
int sum = curr1->val + curr2->val + (isAdd ? 1 : 0);
/* 进位后原位数据处理 */
if(sum >= 10)
{
isAdd = true;
sum = sum - 10;
}
else isAdd = false;
curr2->val = sum;
}
else if(curr1 && !curr2)
{
/* 数字链表2如果较短,则和数字链表1进行交换,使得统一进入下一个if判断 */
prev2->next = curr1;
prev1->next = nullptr;
curr2 = curr1;
curr1 = nullptr;
continue;
}
else if(!curr1 && curr2)
{
int sum = curr2->val + (isAdd ? 1 : 0);
if(sum >= 10)
{
isAdd = true;
sum = sum - 10;
}
else isAdd = false;
curr2->val = sum;
}
prev2 = curr2;
curr2 = curr2->next;
/* 较短的数字链表1如果为空则不需要继续遍历 */
if(curr1)
{
prev1 = curr1;
curr1 = curr1->next;
}
}
/* 最后的位数如果产生进位需要新增链表节点 */
if(isAdd)
{
ListNode* addNewNum = new ListNode(1);
prev2->next = addNewNum;
}
return l2;
}
};