[LeetCode]2. 两数相加(难度:中等)
题目:
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字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]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
思路:模拟
由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。我们可以同时遍历两个链表,计算他们的和。本题没有太大的难度,但是有几种不同的操作顺序,选择不同的顺序,代码编写难度会不同,效率也会有细微差别。
新建链表结点or利用已有结点,显然利用已有结点构造链表在时间上快于新建结点,但编写难度比新建结点复杂。一边遍历一边处理数据or构造完链表再处理数据,显然第一种时间更快(只需一次遍历),同样编写代码稍复杂。
我更偏向于运行效率,所以我利用l1结点建立链表newl,将计算结果记录在l1.val中,将进位值加到下一结点,处理直到某一链表遍历完成,此时会出现三种情况。(1)l1.next == null && l2.next != null(2)l1.next != null && l2.next == null(3)l1.next == null && l2.next == null。只有第一种情况会导致无法利用l1结点构造链表,需要特殊处理,也很容易实现,将l1.next = l2.next,就将剩余全部结点链接到newl中,接着遍历进行处理,最后一个结点需单独处理,因为如果最后一结点值大于10,则需要进位,就需要新建一结点保存进位值,最后将新建结点加入newl即完成。
// Java代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode newl = l1;// 利用l1构造和链表
while (l1.next != null && l2.next != null) {// 处理都不为空的正常情况
l1.val += l2.val;// 将l1和l2的值的和保存在l1
if (l1.val >= 10) {// 进行/和%操作处理
l1.next.val += l1.val / 10;// 将进位加到l1.next
l1.val %= 10;// 更新当前结点值
} l1 = l1.next;// 指针后移
l2 = l2.next;// 指针后移
}
if (l2.next != null) {
// 处理l2.next == null的特殊情况,另外两种情况不需要处理
// 即l1.next和l2.next都为空;以及l1.next == null
l1.next = l2.next;
} l1.val += l2.val;// 将l1和l2的值的和保存在l1
while (l1.next != null) {// 遍历剩下的结点
if (l1.val >= 10) {// 进行/和%操作处理
l1.next.val += l1.val / 10;// 将进位加到l1.next
l1.val %= 10;// 更新当前结点值
}
l1 = l1.next;// 指针后移
} if (l1.val >= 10) {// 处理最后一个结点的特殊情况
// 后边已无结点,需新建
ListNode newnode = new ListNode(l1.val / 10, null);
l1.next = newnode;// 将新结点加入链表
l1.val %= 10;// 更新当前结点值
} return newl;// 返回最终的和链表
}
}
// C++代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* newl = l1;// 利用l1构造和链表
while (l1->next != nullptr && l2->next != nullptr) {// 处理都不为空的正常情况
l1->val += l2->val;// 将l1和l2的值的和保存在l1
if (l1->val >= 10) {// 进行/和%操作进行处理
l1->next->val += l1->val / 10;// 将进位加到l1.next
l1->val %= 10;// 更新当前结点值
} l1 = l1->next;// 指针后移
l2 = l2->next;// 指针后移
}
if (l2->next != nullptr) {
// 处理l2.next == null的特殊情况,另外两种情况不需要处理
// 即l1.next和l2.next都为空;以及l1.next == null
l1->next = l2->next;
} l1->val += l2->val;// 将l1和l2的值的和保存在l1
while (l1->next != nullptr) {// 遍历剩下的结点
if (l1->val >= 10) {// 进行/和%操作进行处理
l1->next->val += l1->val / 10;// 将进位加到l1.next
l1->val %= 10;// 更新当前结点值
}
l1 = l1->next;// 指针后移
} if (l1->val >= 10) {// 处理最后一个结点的特殊情况
// 后边已无结点,需新建
ListNode* newnode = new ListNode(l1->val / 10, nullptr);
l1->next = newnode;// 将新结点加入链表
l1->val %= 10;// 更新当前结点值
} return newl;// 返回最终的和链表
}
};
[LeetCode]2. 两数相加(难度:中等)的更多相关文章
- LeetCode 445——两数相加 II
1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...
- Leetcode 002. 两数相加
1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- LeetCode刷题--两数相加(中等)
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- LeetCode 445. 两数相加 II(Add Two Numbers II)
445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...
- Leetcode 445. 两数相加 II
1.题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. ...
- LeetCode 2. 两数相加(Add Two Numbers)
2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...
- LeetCode 2——两数相加(JAVA)
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- Java实现 LeetCode 2 两数相加
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- leetcode TOP100 两数相加
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
随机推荐
- mobile app & ppi & dpi & px
mobile app & ppi & dpi & px How do dp, dip, dpi, ppi, pixels and inches relate? https:// ...
- js 实现简单的parseInt和parseFloat
function myParseInt(str: string): number { let result = NaN; for (let i = 0; i < str.length; i++) ...
- C-Sharp 调用命令行
https://stackoverflow.com/questions/1469764/run-command-prompt-commands 带控制台 string strCmdText = &qu ...
- LinkedList 的实现原理
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类就直接说了.LinkedList 的底层结构是一个带头/尾指针的双向链表,可以 ...
- JS判断年份是否为闰年
//闰年能被4整除且不能被100整除,或能被400整除.function year(){ if(year%4==0&&year%100!=0||year%400==0){ ...
- 【资源下载】安卓VS鸿蒙第三方件切换宝典 V1.0
下载<安卓VS鸿蒙第三方件切换宝典> 由于字数较多,本文仅展示部分,查看完整版请点击上方下载 众所周知,安卓应用开发经过这么多年的发展相对成熟和稳定,鸿蒙OS作为后来者兼容一个成熟的开发体 ...
- Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name.
Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name. 我 ...
- arti车是大幅度发地方大幅度发
转: arti车是大幅度发地方大幅度发 arti车是大幅度发地方大幅度发 转: arti车是大幅度发地方大幅度发
- mpvue 开发微信小程序搭建项目
首先 mpvue 是一款基于vue的框架,mpvue 修改了 Vue.js 的 runtime 和 compile 实现,可以运行在小程序的环境中. 第一步:安装 vue-cli vue-cli是vu ...
- 剑指 Offer 42. 连续子数组的最大和 + 动态规划
剑指 Offer 42. 连续子数组的最大和 题目链接 状态定义: 设动态规划列表 \(dp\) ,\(dp[i]\) 代表以元素 \(4nums[i]\) 为结尾的连续子数组最大和. 为何定义最大和 ...