两数相加
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 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;
}
};
热门相关:洪荒二郎传 本法官萌萌哒 异世修真邪君 今天也没变成玩偶呢 拒嫁豪门,前妻太抢手