题目:

  给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字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. website i18n and L10n all in one

    website i18n and L10n all in one Localization & Internationalization 本地化 & 国际化 https://www.w ...

  2. Node.js & ES Modules & Jest

    Node.js & ES Modules & Jest CJS & ESM CommonJS https://en.wikipedia.org/wiki/CommonJS ht ...

  3. Parcel all in one

    Parcel all in one Parcel https://parceljs.org/ # cli $ yarn global add parcel-bundler $ npm install ...

  4. onsen & UI & vue & mobile UI

    onsen & UI vue & mobile UI $ npm i onsenui vue-onsenui # OR $ npm i -S onsenui vue-onsenui h ...

  5. scrollTo & js auto scroll & scrollX & scrollY

    scrollTo & js auto scroll & scrollX & scrollY scrollX & scrollY 获取 scroll top height ...

  6. lua调用dll导出的函数

    参考手册 hello.dll #include "pch.h" #include "lua.hpp" #pragma comment(lib, "lu ...

  7. SVG to GeoJSON

    SVG to GeoJSON GEOJSON https://geojson.org/ http://geojson.io/ https://github.com/mapbox/geojson.io/ ...

  8. Github Packages和Github Actions实践之CI/CD

    概述 Github在被微软收购后,不忘初心,且更大力度的造福开发者们,推出了免费私有仓库等大更新.近期又开放了packages和actions两个大招,经笔者试用后感觉这两个功能配合起来简直无敌. G ...

  9. VMware安装centos.6.8无法访问主机的问题

    安装步骤 点击下一步,如下图: 接上图: 接上图: 接上图 接上图: 接上图: 接上图: 接上图 接上图: 接上图: 接上图: 接上图: 接上图: 接上图: 点击 完成: 启动虚拟机进行安装: 发现报 ...

  10. TERSUS无代码开发(笔记06)-简单实例手机端页面设计

    手机端的设计 1.页面说明 2.默认页面===>提交请假单(上面页面双击进入,页面主要编辑区) 2.1默认页面===>提交请假单===>头部区(页面部份主要编辑区01) 2.1.1默 ...