题目:

  给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字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. 两数相加(难度:中等)的更多相关文章

  1. LeetCode 445——两数相加 II

    1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...

  2. Leetcode 002. 两数相加

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

  3. LeetCode刷题--两数相加(中等)

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

  4. LeetCode 445. 两数相加 II(Add Two Numbers II)

    445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...

  5. Leetcode 445. 两数相加 II

    1.题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. ...

  6. LeetCode 2. 两数相加(Add Two Numbers)

    2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...

  7. LeetCode 2——两数相加(JAVA)

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

  8. Java实现 LeetCode 2 两数相加

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

  9. leetcode TOP100 两数相加

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

随机推荐

  1. after upgrade macOS Catalina bugs

    after upgrade macOS Catalina bugs 升级了macOS catalina后,碰到的 bugs? macOS 10.15.5 https://www.apple.com/m ...

  2. zrender & svg

    zrender & svg window.prompt double click https://codepen.io/xgqfrms/pen/jOEGNvw // https://cdn.x ...

  3. Nice!JavaScript基础语法知识都在这儿了

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 转载请注明出处! 链接:https://blog.csdn ...

  4. Python爬虫_qq音乐示例代码

    import requests url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp' for x in range(5): headers ...

  5. c# 打印面单

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { ...

  6. 后端程序员之路 32、Index搜索引擎实现分析1-类的设计

    # 1.forward_index 正排索引(正向索引)- filter_t- filter_judge # 2.inverted_index 倒排索引(反向索引)- inverted_pre_sco ...

  7. arch 安装笔记

    arch- 第一次装archLinux时,照着别人的安装教程来安装,由于不懂有些命令的意思,装了好几次才成功,这次趁着热乎,把安装的步骤写下来,为自己踩踩坑(桌面是xfce,下面也有换桌面的方法,我第 ...

  8. MySQL注入与informantion_schema库

    目录 只可读 自动开启 和MySQL注入有关的3个表 手动注入的使用案例 表介绍 查询一个表中全部字段的过程 MySQL V5.0安装完成会默认会生成一个库(informantion_schema), ...

  9. jquery ajax error 函数的参数及使用

    使用jquery的ajax方法向服务器发送请求的时候,可选的回调函数有success.complete.beforeSend.error函数等.error函数常用来进行错误信息的处理,这里着重提一下e ...

  10. 少走弯路之marshalsec的编译(RMI必备工具)

        0x00 实验环境 实验机:Ubuntu18(公网Linux系统) 0x01 安装包 私聊我博客将会第一时间提供安装包环境: 0x02 避坑指南 由上篇文章:https://www.cnblo ...