题目来源:力扣(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每周算法】两数相加相关推荐

  1. leetcode算法—两数相加 Add Two Numbers

    关注微信公众号:CodingTechWork,一起学习进步. 题目 Add Two Numbers: You are given two non-empty linked lists represen ...

  2. LeetCode实战:两数相加

    题目英文 You are given two non-empty linked lists representing two non-negative integers. The digits are ...

  3. leetcode第一题两数相加

    leetcode两数相加: 提示: 问题描述: int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int ...

  4. 【LeetCode】2.两数相加

    1.两数相加 一.问题描述 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表 ...

  5. 刻意练习:LeetCode实战 -- Task10. 两数相加

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  6. leetCode刷题--两数相加

    给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 ...

  7. 【LeetCode 2】两数相加(链表)

    给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 ...

  8. leetcode No.2 两数相加

    题目 链接:https://leetcode-cn.com/problems/add-two-numbers 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储 ...

  9. python怎么设编程两个数相加时_黄哥Python, LeetCode 第二题两数相加代码

    来源力扣​leetcode-cn.com 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相 ...

  10. leetcode C++ 2. 两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数

    一.C++ ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *resList = new ListNode(-1);resL ...

最新文章

  1. 17岁高中生独立开发全球最火疫情追踪网站
  2. ECS控制台支持创建资源时绑定标签
  3. service数据保存_「数据架构」数据流程图与实例-客户服务系统
  4. ARP协议及ARP欺骗详解
  5. java合并整形_java中2个int合并成一个long
  6. yolov配置之:cuda、 cudnn安装
  7. java concurrent 锁_java并发机制锁的类型和实现
  8. A few thoughts about Open Source Software
  9. 34(数组). 在排序数组中查找元素的第一个和最后一个位置
  10. oracle 常用系统表
  11. 从零开始配置 vim(3)—— 键盘映射进阶
  12. Redis实战pdf
  13. 把视频转换成图片帧的代码
  14. win8.1产品安装临时密钥
  15. 如何在 HTML 网站上创建其他网页
  16. 和Mengjiji一起攻克难关
  17. 题目4:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
  18. 2017.6.12“找回本心 坚持学习”
  19. 知乎大佬图文并茂的epoll讲解,看不懂的去砍他
  20. 图扑软件数字孪生 3D 风电场,智慧风电之海上风电

热门文章

  1. collections模块介绍
  2. vray渲染出图尺寸_Vray渲染出图该如何正确保存
  3. (chap6 Http首部) 响应首部字段 Ct-MD5Ct-RangeCt-TypeExpiresLast-Modified
  4. 6. Qt 信号与信号槽 (7)-QMetaObject:: activate
  5. 程序设计中的几种设计原则
  6. buu 密码学的心声
  7. buu Alice与Bob
  8. 【python】数据结构与算法—哈希表
  9. 拜占庭将军问题与中本聪
  10. 获取系统进程信息和进程依赖的dll信息--CreateToolhelp32Snapshot