日野弥生:勉強しよう

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;
    }
};

フラッシュタブ:LeetCode

题目链接:https://leetcode.cn/problems/add-two-numbers/

上一篇

LeetCode 234 - 回文链表

下一篇

LeetCode 21 - 合并两个有序链表