给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

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

答案:

/**

 * Definition for singly-linked list.

 * 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) {

// 定义结果链表的头指针head和尾指针tail,初始为空
        ListNode *head = nullptr, *tail = nullptr;

// 进位值,初始为0
        int carry = 0;

// 当l1或l2不为空时循环
        while (l1 || l2) {

// 取当前节点值,若链表已空则取0
            int n1 = l1 ? l1->val: 0;
            int n2 = l2 ? l2->val: 0;

// 计算当前位总和 = 两数当前位 + 进位
            int sum = n1 + n2 + carry;

// 若结果链表为空,创建头节点
            if (!head) {
                head = tail = new ListNode(sum % 10);
            } else {

          // 否则在尾部添加新节点
                tail->next = new ListNode(sum % 10);
                tail = tail->next;
            }

       // 更新进位(sum除以10取整)
            carry = sum / 10;

       // 移动l1、l2指针到下一位
            if (l1) {
                l1 = l1->next;
            }
            if (l2) {
                l2 = l2->next;
            }
        }

// 若最后还有进位,补充新节点
        if (carry > 0) {
            tail->next = new ListNode(carry);
        }
        return head;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/add-two-numbers/solutions/435246/liang-shu-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)

算法原理:

1.逐位相加:从两个链表的头结点(对应数字的个位)开始依次相加

2.处理进位:每次相加后,用SUM%10得到当前位的结果,SUM/10得到进位值

3.链表遍历:当其中一个链表遍历完后,用0补位继续计算

4.最终进位:循环结束后如果还有进位,需要额外添加一个节点存储进位

更多推荐