两数相加

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 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为进位 $$
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. *     int val;
  5. *     ListNode *next;
  6. *     ListNode() : val(0), next(nullptr) {}
  7. *     ListNode(int x) : val(x), next(nullptr) {}
  8. *     ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13.     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  14.         ListNode *res = new ListNode();
  15.         ListNode *temp = res;
  16.         int t = 0;
  17.         while ( l1 || l2) {                // l1和l2不一样长,需要等到两个数组都计算完毕才结束循环
  18.             if ( l1 ) {
  19.                 t += l1->val;                // t临时变量加上l1数组当前位次的值
  20.                 l1 = l1->next;                // l1 指向下一位,准备下一个数字的计算
  21.             }
  22.             if ( l2) {
  23.                 t += l2->val;                // 同上
  24.                 l2 = l2->next;                // 同上
  25.             }
  26.             ListNode *newNode = new ListNode(t % 10);        //调用构造函数
  27.             temp->next = newNode;
  28.             temp = temp->next;        // temp指针指向新节点,保证temp指针指向的是末尾节点
  29.             t /= 10;        // 这里的t 为 进位 ,比如说 l1->val + l2->val = 13 ,那么插入的节点值为 13 % 10 == 3
  30.                                     //而进位为 13 / 10 == 1
  31.         }
  32.         //当计算完毕后,有可能还存在进位,所以判断t的值,如果不为0,就需要再插入到末尾节点。
  33.         if ( t > 0) {
  34.             ListNode *newNode = new ListNode(1);
  35.             temp->next = newNode;
  36.         }
  37.                 //由于res是带头节点的单链表,要使得第一个节点就为元素,则返回下一个节点。
  38.         return res->next;
  39.     }
  40. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表