【LeetCode每周算法】两数相加
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 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
- 题目数据保证列表表示的数字不含前导零
解法一:
根据链表特点,直接按顺序遍历,计算对应位的数值,同时记录进位即可。
public class Add {public static void main(String[] args) {Add add = new Add();ListNode l1 = new ListNode(1);l1.next = new ListNode(2);ListNode l2 = new ListNode(9);l2.next = new ListNode(8);
// l2.next.next = new ListNode(4);ListNode listNode = add.addTwoNumbers2(l1, l2);System.out.println(listNode);}public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {// 定义当前遍历到的节点--可以省略,直接使用l1和l2ListNode cur1 = l1;ListNode cur2 = l2;// 结果:待返回的nodeListNode node = null;// 处理返回链表中,当前节点的下一个节点ListNode next = null;// 相加后进位数值:8+3=11,则进位1int step = 0;// 这里遍历次数执行定义为1000,因为条件中说明,数值最大不超过100位,也就是链表长度不可能超过100.// 这里可以优化,使用while循环,将下面的退出条件放在while条件中for (int i = 0; i < 1000; i++) {// 当前节点数值int val1 = 0;int val2 = 0;if (cur1 != null) {val1 = cur1.val;cur1 = cur1.next;}if (cur2 != null) {val2 = cur2.val;cur2 = cur2.next;}// 当前节点值加进位的数值之和int val = val1 + val2 + step;// 处理进位以及计算当前位置最终值step = val / 10;val = val - step * 10;if (node == null) {node = new ListNode(val);// 记录next,方便给下一个节点关联next = node;} else {next.next = new ListNode(val);next = next.next;}// 如果当前节点都为空,且没有进位,则停止if (cur1 == null && cur2 == null && step==0) {break;}}return node;}}class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
解法二:递归
递归退出条件:当两个节点都是空的时候退出。
那如果有任一节点为空,另外一个节点不为空,那我们的节点相加逻辑就会出现空指针异常,在这里直接牺牲空间来满足处理逻辑。
进位处理:默认在任何一个加数节点上即可,这里放在了l1上
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if(l1 == null && l2 ==null){return null;}if(l1 == null){l1 = new ListNode(0);}if(l2 == null){l2 = new ListNode(0);}int rval = l1.val + l2.val;if(rval >= 10){rval = rval % 10;if(l1.next != null){l1.next.val+=1;}else{l1.next = new ListNode(1);}}return new ListNode(rval, addTwoNumbers(l1.next, l2.next));}
}
【LeetCode每周算法】两数相加相关推荐
- leetcode算法—两数相加 Add Two Numbers
关注微信公众号:CodingTechWork,一起学习进步. 题目 Add Two Numbers: You are given two non-empty linked lists represen ...
- LeetCode实战:两数相加
题目英文 You are given two non-empty linked lists representing two non-negative integers. The digits are ...
- leetcode第一题两数相加
leetcode两数相加: 提示: 问题描述: int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int ...
- 【LeetCode】2.两数相加
1.两数相加 一.问题描述 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表 ...
- 刻意练习:LeetCode实战 -- Task10. 两数相加
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- leetCode刷题--两数相加
给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 ...
- 【LeetCode 2】两数相加(链表)
给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 ...
- leetcode No.2 两数相加
题目 链接:https://leetcode-cn.com/problems/add-two-numbers 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储 ...
- python怎么设编程两个数相加时_黄哥Python, LeetCode 第二题两数相加代码
来源力扣leetcode-cn.com 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相 ...
- leetcode C++ 2. 两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数
一.C++ ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *resList = new ListNode(-1);resL ...
最新文章
- 17岁高中生独立开发全球最火疫情追踪网站
- ECS控制台支持创建资源时绑定标签
- service数据保存_「数据架构」数据流程图与实例-客户服务系统
- ARP协议及ARP欺骗详解
- java合并整形_java中2个int合并成一个long
- yolov配置之:cuda、 cudnn安装
- java concurrent 锁_java并发机制锁的类型和实现
- A few thoughts about Open Source Software
- 34(数组). 在排序数组中查找元素的第一个和最后一个位置
- oracle 常用系统表
- 从零开始配置 vim(3)—— 键盘映射进阶
- Redis实战pdf
- 把视频转换成图片帧的代码
- win8.1产品安装临时密钥
- 如何在 HTML 网站上创建其他网页
- 和Mengjiji一起攻克难关
- 题目4:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
- 2017.6.12“找回本心 坚持学习”
- 知乎大佬图文并茂的epoll讲解,看不懂的去砍他
- 图扑软件数字孪生 3D 风电场,智慧风电之海上风电