首页 > 其他分享 >LeetCode-两数相加

LeetCode-两数相加

时间:2024-08-06 17:07:09浏览次数:11  
标签:ListNode mathcal 相加 next l2 l1 节点 LeetCode 两数

前言

这道题将整数加法转换为在单链表上做加法运算,涉及到知识点:

  1. 单链表的遍历
  2. 单链表插入新节点

题目描述

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

示例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

  • 题目数据保证列表表示的数字不含前导零

题目分析

单链表遍历只能 单向单步:给定一个节点的指针,那么它只能访问下一个节点的内容。单链表的遍历时间复杂度唯一: \(\mathcal{O}(n)\) 。

注意到:由于每个节点只能存储一位数字,那么两个对应位相加的最大值为 \(9 + 9 = 18\) ,因此我们的十进制 进位 最大只会为 1

暴力算法

就像普通的十进制数加法一样,每一位相加后对 \(10\) 取余作为当前位的答案,而对 \(10\) 取商作为进位。遍历完后还需要判断是否进位不为 \(0\) ,如果不为 \(0\) ,就还需要增加数字为 \(1\) 的节点。

假设 \(A\) 代表 \(L_1\) 链表, \(B\) 代表 \(L_2\) 链表, \(C\) 代表 \(L_1\) 与 \(L_2\) 的和 :

\[C = A + B \\ \]

因此给出数学公式:

\[\begin{equation} \begin{aligned} \begin{cases} C_i &= A_i + B_i + t(\text{进位}),\qquad &0\leq i\leq max(A.length , B.length)\\ \\ \\ C_i &= 1, & t = 1 ,\quad i = max(A.length , B.length) + 1 \end{cases} \end{aligned} \end{equation} \]

解题代码

/**
 * 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* head = new ListNode();
        ListNode* cur = head;
        int t = 0;
        while ( l1 || l2) {
            if ( l1) {
                t += l1->val;
                l1 = l1->next;
            }
            if ( l2) {
                t += l2->val;
                l2 = l2->next;
            }
            ListNode* nnew = new ListNode(t % 10);
            cur->next = nnew;
            t /= 10;
            cur = cur->next;    // 准备下一次的增加新节点
        }
        if ( t ) {
            ListNode* nnew = new ListNode(1);
            cur->next = nnew;
        }
        return head->next;
    }
};

复杂度分析

\[\begin{equation}\begin{aligned} \mathcal{O}(Complex) &= \mathcal{O}(\text{单个节点处理:申请节点,插入节点})\\ &+\mathcal{O}(遍历) \\ &= \mathcal{O}(k\times n) + \mathcal{O}(n )\\ \end{aligned}\end{equation} \]

最终我们的时间复杂度为 \(\mathcal{O}(n)\) 。

我们在刚开始刷题的时候,可以先试着自己写出暴力算法,然后分析一下时间复杂度,再尝试其他解题方法。

标签:ListNode,mathcal,相加,next,l2,l1,节点,LeetCode,两数
From: https://www.cnblogs.com/whtmomo/p/18345599

相关文章

  • LeetCode刷题-两数之和
    一、两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=......
  • LeetCode-两数之和
    前言这道题是Leetcode的第一题,也是经典题目之一,几乎所有刷题网站的第一题都是“两数之和”,只是Leetcode这道题不一样。在这篇博客中,我们介绍了两种解法:暴力算法哈希表算法\(\mathcal{O}(n^2)\)\(\mathcal{O}(n)\)题目描述给定一个整数数组nums和一个整数目标......
  • leetcode数论(2453. 摧毁一系列目标)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给你一个下标从 0......
  • leetcode数论(326. 3 的幂)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给定一个整数,写一个......
  • leetcode力扣第29题:两数相除
    这题看似简单,实则一点也不难(不是),实则还是比较困难。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。所以一定要有更好的思路(1)通过二分法查找可能的商(2)对于......
  • LeetCode 1631. Path With Minimum Effort
    原题链接在这里:https://leetcode.com/problems/path-with-minimum-effort/description/题目:Youareahikerpreparingforanupcominghike.Youaregiven heights,a2Darrayofsize rowsxcolumns,where heights[row][col] representstheheightofcell (row,c......
  • day32【LeetCode力扣】541. 反转字符串 II
    day32【LeetCode力扣】541.反转字符串II1.题目描述给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符......
  • LeetCode面试150——13罗马数字转整数
    题目难度:简单默认优化目标:最小化平均时间复杂度。Python默认为Python3。目录1题目描述2题目解析3算法原理及代码实现3.1模拟法参考文献1题目描述罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符    数值I      1V    ......
  • 【Python】Python中的输入与输出——内附Leetcode【151.反转字符串中的单词】的C语言
    输入与输出导读一、Python中的输出1.1基本用法1.2格式化输出1.3通过`:`格式化值的输出1.4其它格式化输出二、Python中的输入2.1基本用法2.2`split()`方法2.3split()习题演练结语导读大家好,很高兴又和大家见面啦!!!在上一篇内容中我们介绍了Python中的数据类......
  • leetcode200. 岛屿数量C++题解,精美图例和流程图,一题带你弄懂图的dfs遍历算法
    leetcode200.岛屿数量给你一个由‘1’(陆地)和‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[[“1”,“1”,“1”,......