两数相加

题目描述

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

例子

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

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

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

题解:

按照题意,类比小学数学的两位数加法,只需要将同位次的数字和“进位”相加,就能得到最后结果。
设A数组为 A[m] = { $a_0 , a_1 , a_2 , \dots , a_{m-1} $ }, 相似地,B数组为B[n] = {$b_0 , b_1 , b_2 , \dots , b_{n-1} $}。

要得到C = A + B , 只需要 $$ c_i = a_i + b_i + t \qquad ,其中t为进位 $$

/**
 * 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) {
        ListNode *res = new ListNode();
        ListNode *temp = res;
        int t = 0;
        while ( l1 || l2) {		// l1和l2不一样长,需要等到两个数组都计算完毕才结束循环
            if ( l1 ) {
                t += l1->val;		// t临时变量加上l1数组当前位次的值
                l1 = l1->next;		// l1 指向下一位,准备下一个数字的计算
            }
            if ( l2) {
                t += l2->val;		// 同上
                l2 = l2->next;		// 同上
            }

            ListNode *newNode = new ListNode(t % 10);	//调用构造函数
            temp->next = newNode;
            temp = temp->next;	// temp指针指向新节点,保证temp指针指向的是末尾节点
            t /= 10;	// 这里的t 为 进位 ,比如说 l1->val + l2->val = 13 ,那么插入的节点值为 13 % 10 == 3
            			//而进位为 13 / 10 == 1
        }
        //当计算完毕后,有可能还存在进位,所以判断t的值,如果不为0,就需要再插入到末尾节点。
        if ( t > 0) {
            ListNode *newNode = new ListNode(1);
            temp->next = newNode;
        }
		//由于res是带头节点的单链表,要使得第一个节点就为元素,则返回下一个节点。
        return res->next;
    }
};

热门相关:洪荒二郎传   本法官萌萌哒   异世修真邪君   今天也没变成玩偶呢   拒嫁豪门,前妻太抢手