LeetCode热题100-2.两数相加

LeetCode热题100-2.两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
在这里插入图片描述

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100]0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

思路

已知:数字1非负逆序链表、数字2非负逆序数字链表
条件:两个数字不会以0开头,除了0、两数相加返回和的逆序链表
未知:和的逆序链表
求:和的逆序链表

第一步:
- 遍历两个数字链表,先取出两链表第一位进行加法运算,然后记录下一位进位
- 已知:数字1非负逆序链表、数字2非负逆序数字链表、和链表的第一位、和链表的第二位进位
- 未知:和链表第二位及以后位
第二步:
- 遍历两个数字链表,再取出两链表第二位进行加法运算,然后与进位进行加法运算,最后记录下一位进位
- 已知:数字1非负逆序链表、数字2非负逆序数字链表、和链表的前两位、和链表的第三位进位
- 未知:和链表第三位及以后位
……
第n步:
- 遍历两个数字链表,再取出两链表第n位做加法运算(设短链表为n,长链表为m),然后与进位进行加法运算,最后记录下一位进位
- 已知:数字1非负逆序链表、数字2非负逆序数字链表、和链表的前n位、和链表的第n+1位进位
- 未知:和链表第n+1位及以后位
第n+1步:
- 取长数字链表第n+1与进位做加法运算,然后记录下一进位
- 已知:数字1非负逆序链表、数字2非负逆序数字链表、和链表的前n+1位、和链表的第n+2位进位
- 未知:和链表第n+2位及以后位
……
第m步:
- 取长数字第m位与进制位做加法运算,然后记录下一进位
- 已知:数字1非负逆序链表、数字2非负逆序数字链表、和链表的前m位、和链表的第m+1位进位
- 未知:和链表第m+1位
第m+1步:
- 取进位,如果进位不为0,新建节点,存入进位,添加到和链表尾部
- 已知:数字1非负逆序链表、数字2非负逆序数字链表、和链表
- 解出和链表

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if (l1 == nullptr)
            return l2;
        if (l2 == nullptr)
            return l1;

        ListNode *res = new ListNode(l1->val + l2->val), *t = res, *t1 = l1->next, *t2 = l2->next;
        int carryBit = res->val > 9;
        res->val -= carryBit ? 10 : 0;

        while (t1 != nullptr && t2 != nullptr) {
            t->next = new ListNode(t1->val + t2->val + carryBit);
            t = t->next;
            carryBit = t->val > 9;
            t->val -= carryBit ? 10 : 0;
            t1 = t1->next;
            t2 = t2->next;
        }

        if (t1 == nullptr) {
            while (t2 != nullptr) {
                t->next = new ListNode(t2->val + carryBit);
                t = t->next;
                carryBit = t->val > 9;
                t->val -= carryBit ? 10 : 0;
                t2 = t2->next;
            }
        } else {
            while (t1 != nullptr) {
                t->next = new ListNode(t1->val + carryBit);
                t = t->next;
                carryBit = t->val > 9;
                t->val -= carryBit ? 10 : 0;
                t1 = t1->next;
            }
        }

        if (carryBit != 0) {
            t->next = new ListNode(1);
        }

        return res;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值