- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
两数相加,链表,求加法,题解,leetcode, 力扣,python, c++, java
题目地址:https://leetcode.com/problems/add-two-numbers/description/
Youare given two non-empty
linked lists representing two non-negative integers. The digits are stored in reverse order
and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Youmay assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
有两个链表,分别是逆序了的十进制数字。现在要求两个十位数字的和,要求返回的结果也是链表。
我们先回顾一下十进制加法的计算过程:
使用「竖式」计算十进制的加法的方式:
1、 两个「加数」的右端对齐;
2、 从最右侧开始,依次计算对应的两位数字的和如果和大于等于10,则把和的个位数字计入结果,并向前面进位;
3、 依次向左计算对应位置两位数字的和,如果有进位需要加上进位如果和大于等于10,仍然把和的个位数字计入结果,并向前面进位;
4、 当两个「加数」的每个位置都计算完成,如果最后仍有进位,需要把进位数字保留到计算结果中;
本题中的两个链表表示的数字是个位在前,高位在后。
所以,我们可以从两个链表的开头开始同时向后遍历,模拟上面加法的过程。图源open in new window。
可以用两种做法:循环 + 递归。
1、 不可以把链表先转化成int型数字再求和,因为可能溢出;
2、 两个「加数」的字符串长度可能不同;
3、 在最后,如果进位carry
不为0,那么最后需要计算进位;
循环的思想比较朴素,就是两个指针同时遍历两个链表每个节点并相加的过程。
1、 while(i>=0||j>=0||carry!=0)
含义:
1、 链表a
和b
只要有一个没遍历完,那么就继续遍历;
2、 如果链表a
和b
都遍历完了,但是最后留下的进位carry!=0
,那么需要把进位也保留到结果中;
2、 取a
和b
当前位置数字的时候,如果链表a
或b
已经遍历完了(即i<=0或者j<=0),则认为a
和b
的对应位置是0;
Java 代码如下:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int i1 = l1 != null ? l1.val : 0;
int i2 = l2 != null ? l2.val : 0;
int add = i1 + i2 + carry;
carry = add >= 10 ? 1 : 0;
add = add >= 10 ? add - 10 : add;
cur.next = new ListNode(add);
cur = cur.next;
if (l1 != null)
l1 = l1.next;
if (l2 != null)
l2 = l2.next;
}
return dummy.next;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
C++代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
int carry = 0;
while (l1 || l2 || carry) {
int i1 = l1 ? l1->val : 0;
int i2 = l2 ? l2->val : 0;
int add = i1 + i2 + carry;
carry = add >= 10 ? 1 : 0;
add = add >= 10 ? add - 10 : add;
cur->next = new ListNode(add);
cur = cur->next;
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
return dummy->next;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Python 代码如下:
class Solution(object):
def addTwoNumbers(self, l1, l2):
dummy = ListNode(0)
cur = dummy
carry = 0
while l1 or l2 or carry:
i1 = l1.val if l1 else 0
i2 = l2.val if l2 else 0
add = i1 + i2 + carry
carry = 1 if add >= 10 else 0
add = add - 10 if add >= 10 else add
cur.next = ListNode(add)
cur = cur.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return dummy.next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
复杂度分析:
递归解法非常巧妙。
做递归题目一定要牢记「递归函数的定义」。
递归函数定义:addTwoNumbers
表示将两个链表 l1
和 l2
相加得到的新链表; 递归终止条件:如果 l1
和 l2
有一个为空,则返回另外一个。 递归函数内容:
递归解法妙在天然地处理好了两个链表不一样长、最终相加结果有进位的情况。
Java 代码如下:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
int add = l1.val + l2.val;
ListNode res = new ListNode(add % 10);
res.next = addTwoNumbers(l1.next, l2.next);
if (add >= 10)
res.next = addTwoNumbers(res.next, new ListNode(1));
return res;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14
C++代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
int target = l1->val + l2->val;
ListNode* res = new ListNode(target % 10);
res->next = addTwoNumbers(l1->next, l2->next);
if (target >= 10)
res->next = addTwoNumbers(res->next, new ListNode(1));
delete l1, l2;
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Python 代码如下:
class Solution(object):
def addTwoNumbers(self, l1, l2):
if not l1:
return l2
if not l2:
return l1
add = l1.val + l2.val
res = ListNode(add % 10)
res.next = self.addTwoNumbers(l1.next, l2.next)
if add >= 10:
res.next = self.addTwoNumbers(res.next, ListNode(1))
return res
1 2 3 4 5 6 7 8 9 10 11 12
看完本题解本题,你可以解决以下题目:
1、 「加法」系列题目都不难,其实就是「列竖式」模拟法」
2、 需要注意的是while
循环结束条件,注意遍历两个「加数」不要越界,以及进位;
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
从 angular 5.1 更新到 6.1 后,我开始从我的代码中收到一些错误,如下所示: Error: ngc compilation failed: components/forms/utils.
我正在学习 Typescript 并尝试了解类型和接口(interface)的最佳实践。我正在玩一个使用 GPS 坐标的示例,想知道一种方法是否比另一种更好。 let gps1 : number[];
type padding = [number, number, number, number] interface IPaddingProps { defaultValue?: padding
这两种格式在内存中保存结果的顺序上有什么区别吗? number = number + 10; number += 10; 我记得一种格式会立即保存结果,因此下一行代码可以使用新值,而对于另一种格式,
在 Python 匹配模式中,如何匹配像 1 这样的文字数字在按数字反向引用后 \1 ? 我尝试了 \g用于此目的的替换模式中可用的语法,但它在我的匹配模式中不起作用。 我有一个更大的问题,我想使用一
我的源文件here包含 HTML 代码,我想将电话号码更改为可在我的应用程序中单击。我正在寻找一个正则表达式来转换字符串 >numbernumber(\d+)$1numbernumber<",我们在S
我们有一个包含 2 个字段和一个按钮的表单。我们想要点击按钮来输出位于 int A 和 int B 之间的随机整数(比如 3、5 或 33)? (不需要使用 jQuery 或类似的东西) 最佳答案 你
我收到以下类型错误(TypeScript - 3.7.5)。 error TS2345: Argument of type '(priority1: number, priority2: number
只想创建简单的填充器以在其他功能中使用它: function fillLine(row, column, length, bgcolor) { var sheet = SpreadsheetApp
我有一个问题。当我保存程序输出的 *.txt 时,我得到以下信息:0.021111111111111112a118d0 以及更多的东西。 问题是: 这个数字中的“d0”和“a”是什么意思? 我不知道“
首先:抱歉标题太长了,但我发现很难用一句话来解释这个问题;)。是的,我也四处搜索(这里和谷歌),但找不到合适的答案。 所以,问题是这样的: 数字 1-15 将像这样放在金字塔中(由数组表示):
我想从字符串中提取血压。数据可能如下所示: text <- c("at 10.00 seated 132/69", "99/49", "176/109", "10.12 I 128/51, II 1
当尝试执行一个简单的 bash 脚本以将前面带有 0 的数字递增 1 时,原始数字被错误地解释。 #!/bin/bash number=0026 echo $number echo $((number
我有一个类型为 [number, number] 的字段,TypeScript 编译器(strict 设置为 true)出现问题,提示初始值值(value)。我尝试了以下方法: public shee
你能帮我表达数组吗:["232","2323","233"] 我试试这个:/^\[("\d{1,7}")|(,"\d{1,7}")\]$/ 但是这个表达式不能正常工作。 我使用 ruby(rail
这个问题在这里已经有了答案: meaning of (number) & (-number) (4 个回答) 关闭6年前. 例如: int get(int i) { int res = 0;
我正在考虑使用 Berkeley DB作为高度并发的移动应用程序后端的一部分。对于我的应用程序,使用 Queue对于他们的记录级别锁定将是理想的。但是,如标题中所述,我需要查询和更新概念建模的数据,如
我正在尝试解决涉及重复数字的特定 JavaScript 练习,为此我需要将重复数字处理到大量小数位。 目前我正在使用: function divide(numerator, denominator){
我有这个数组类型: interface Details { Name: string; URL: string; Year: number; } interface AppState {
我们正在使用 Spring 3.x.x 和 Quartz 2.x.x 实现 Web 应用程序。 Web 服务器是 Tomcat 7.x.x。我们有 3 台服务器。 Quartz 是集群式的,因此所有这
我是一名优秀的程序员,十分优秀!