题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

方法一

思路

  • 将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 0,比如 987 + 23 = 987 + 023 = 1010
  • 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
  • 如果两个链表全部遍历完毕后,进位值为 1,则在新链表最前方(链表末尾,因为是逆序)添加节点 1
  • 小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。

 

图1,对两数相加方法的可视化: 342 + 465 = 807342+465=807,每个结点都包含一个数字,并且数字按位逆序存储。

请注意,我们使用哑结点来简化代码。如果没有哑结点,则必须编写额外的条件语句来初始化表头的值。

请特别注意以下情况:

代码

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head,是用来定位头结点的
ListNode pre = new ListNode(0);
ListNode cur = pre;
//进位初始化为0
int carry = 0;
//遍历列表l1和l2,直至到达它们的尾端
while (l1 != null || l2 != null) {
//将x设为结点p的值。如果已经到达l1的未尾,则将其值设置为0
int x = l1 == null ? 0 : l1.val;
//将y设为结点q的值。如果已经到达l2的未尾,则将其值设置为0
int y = l2 == null ? 0 : l2.val;
//每一位sum的值
int sum = x + y + carry;
//更新进位的值,在这里非0即1
carry = sum / 10;
//创建一个数值为(sum mod 10)的新结点,并将其设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
cur.next = new ListNode(sum % 10);
//cur往后移动一个位置
cur = cur.next;
//l1前进到下一个结点
if (l1 != null)
l1 = l1.next;
//l2前进到下一个结点
if (l2 != null)
l2 = l2.next;
}
//检查 carry = 1是否成立,如果成立,则向返回列表追加一个含有数字l1的新结点。
if (carry == 1) {
cur.next = new ListNode(carry);
}
//返回是返回listNode这个对象,listNode对象中有next属性能指向下一个节点,这样就把所有节点串联起来了
return pre.next;
}
}

复杂度分析

  • 时间复杂度:O(max(m,n)),假设m和n分别表示 l1 和 l2 的长度,上面的算法最多重复max(m,n)次 。
  • 空间复杂度:O(max(m,n)),新列表的长度最多为max(m,n)+1 。

拓展

如果链表中的数字不是按逆序存储的呢?例如:
(3 → 4 → 2)+(4 → 6 → 5)= 8 → 0 → 7

LeetCode刷题--两数相加(中等)的更多相关文章

  1. leetCode刷题 | 两数相加

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  2. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

  3. leetCode刷题 | 两数之和

    两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...

  4. LeetCode :2.两数相加 解题报告及算法优化思路

    题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...

  5. LeetCode | No.2 两数相加

    ​题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  6. LeetCode Golang 2. 两数相加

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

  7. python刷LeetCode:2.两数相加

    难度等级:中等 题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返 ...

  8. leetcode题目2.两数相加(中等)

    题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...

  9. LeetCode 2:两数相加 Add Two Numbers

    ​给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

随机推荐

  1. 笔记||Python3之布尔表达式+条件判断

    布尔表达式:        布尔类型:特性:只有两种情况 ---   真  /  假 1 -- True    False 2 -- type(True) ------------ <class ...

  2. 插入排序 C&&C++

    (blog主要用于展示算法流程) 插入排序算法:通过对未排序的数据逐个插入合适的位置而完成排序工作       流程: (1)先对数组前两个数据进行从小到大排序 (2)将第三个数据与前两个数据比较,将 ...

  3. Mock接口依赖的使用

    mock 能做什么 1.前后端联调,如果你是一个前端页面开发,现在需要开发一个功能:下一个订单,支付页面的接口,根据支付结果,支付成功,展示支付成功页,支付失败,展示支付失败页.要完成此功能,你需要 ...

  4. Java内存大家都知道,但你知道要怎么管理Java内存吗?

    前言 深入研究Java内存管理,将增强你对堆如何工作.引用类型和垃圾回收的认识. 你可能会思考,如果你使用Java编程,关于内存如何工作你需要了解哪些哪些信息?Java可以进行自动内存管理,而且有一个 ...

  5. VMware中Bridged、NAT、host-only三种网络连接模式的原理及其区别

    VMnet0:这是VMware用于虚拟桥接网络下的虚拟交换机: VMnet1:这是VMware用于虚拟Host-Only网络下的虚拟交换机: VMnet8:这是VMware用于虚拟NAT网络下的虚拟交 ...

  6. 【玩转SpringBoot】让错误处理重新由web服务器接管

    其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...

  7. Linux Bash文本操作之grep篇

    Linux grep命令用于查找文件里符合条件的字符串.是文本检索中常用的工具之一. grep  指令在文件中查找能够匹配指定模式字符串的行.如果没有指定文件名,或者文件名为  -  ,则从标准输入设 ...

  8. C#8.0中新特性之一:结构readonly成员

    结构struct成员支持readonly,用来限制被其修饰的成员不会改变结构的内部状态.加上7.2版本添加的readonly struct和ref readonly方法返回以及之前的字段声明修饰作用, ...

  9. GrimTheRipper: 1 Vulnhub Walkthrough

    靶机下载: https://www.vulnhub.com/entry/grimtheripper-1,350/ 主机层面端口扫描: ╰─ nmap -p1-65535 -A 10.10.202.15 ...

  10. 微信公众号:Mysticbinary

    愿你有绝对自由.每周会写一篇哲学类文章.