• 题目:
  • * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
  • * 请你将两个数相加,并以相同形式返回一个表示和的链表。
  • * 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

本题为力扣原题,链接为 https://leetcode.cn/problems/add-two-numbers/,具体例子参照原题给的demo

  解题思路:

  • 两个单链表中的整数相加,涉及到相加和超过10,需要向前进一位
  • 两个链表是否等长需要判断,如果不等长度,需要先计算等长部分,超出的部分需要根据思路1得出的结果判读。也就是前一位相加和满足进位,则继续计算;反之,则停止
package code.code_02;

/**
* 力扣原题 https://leetcode.cn/problems/add-two-numbers/
* 题目:
* 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
* 请你将两个数相加,并以相同形式返回一个表示和的链表。
* 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
*
* demo1
* 输入:l1 = [2,4,3], l2 = [5,6,4]
* 输出:[7,0,8]
* 解释:342 + 465 = 807.
*
* demo2
* 输入: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
* 题目数据保证列表表示的数字不含前导零
*
* 解题思路
* 1, 两两相加,涉及到和超过10进位数
* 2, 涉及到两个链表长度不等
* 3, 可以补全两个链表,和单独生成一个新链表,但是浪费空间;
* 4; 可以把两数之和压入长链表中,逢十进一
*
*/
public class NodeListAddTest { //链表
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; }
} public int length (ListNode node, int size)
{
while (node != null) {
size++;
node = node.next;
}
return size;
} //获取链表长度_递归方式
/* public int length (ListNode node, int size)
{
if (node == null) {
return size;
}
size++;
return node.next != null ? length(node.next, size) : size;
}*/ public ListNode addTwoNumbers(ListNode l1, ListNode l2)
{
int length1 = this.length(l1, 0);
int length2 = this.length(l2, 0); ListNode lNode = length1 < length2 ? l2 : l1; //长链表
ListNode sNode = (lNode == l1) ? l2 : l1; //短链表
ListNode prev = null; int carry = 0; //进位
ListNode node = lNode; //根据短链表进行循环
while (sNode != null) {
int total = sNode.val + lNode.val + carry;
lNode.val = total % 10; //更新后,长链表当前位置的新值
carry = total/10; //如果是1, 则需要进位
if (lNode.next == null) {
prev = lNode;
}
lNode = lNode.next;
sNode = sNode.next;
} //有可能两个链表长度不一致,此时长链表需要继续.
while (lNode != null) {
if (carry != 1) {
break;
}
int total = lNode.val + carry;
lNode.val = total % 10; //更新后,长链表当前位置的新值
carry = total/10; //如果是1, 则需要进位
if (lNode.next == null) {
prev = lNode;
}
lNode = lNode.next;
} //如果长链表最后一位数处理完还需要进位,则追加节点
if (carry == 1) {
ListNode tempNode = new ListNode(carry);
prev.next = tempNode;
} return node;
} // 先设计打印方法,方便检查逆转后结果
public void printNode (ListNode node)
{
if (node == null) {
System.out.println("链表不存在");
}
System.out.println("当前节点的值为: " + node.val);
//递归的方式逐层打印Node的子节点
if(node.next != null) {
printNode(node.next);
}
} public static void main(String[] args) {
NodeListAddTest test = new NodeListAddTest();
//链表1
ListNode l1 = test.new ListNode(2);
l1.next = test.new ListNode(4);
l1.next.next = test.new ListNode(3); //链表2
ListNode l2 = test.new ListNode(5);
l2.next = test.new ListNode(6);
l2.next.next = test.new ListNode(4); ListNode nodeList = test.addTwoNumbers(l1, l2);
test.printNode(nodeList); }
}

力扣测试结果:

算法5: LeetCode_单链表_两数相加的更多相关文章

  1. C语言链表之两数相加

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

  2. Leetcode算法系列(链表)之两数相加

    Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...

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

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

  4. 用单向链表实现两数倒序相加(java实现)

    很久没做算法题了,准备重操旧业,于是刷了一波LeetCode,看到一个比较经典的链表算法题,分享出来. 题目 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将 ...

  5. 两数相加(C#数据结构和算法练习)

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

  6. cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...

  7. Leetcode_两数相加_python

    小编从今天起要开始分享一些Leetcode代码,通过好好练习编程能力,争取以后找一份好工作. 题目:两数相加 # Definition for singly-linked list. # class ...

  8. 【leetcode】 算法题2 两数相加

      问题      给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

  9. leetcode 链表 两数相加

     两数相加     给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

  10. Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

随机推荐

  1. 使用 Spring Boot Admin 监控应用状态

    程序员优雅哥 SpringBoot 2.7 实战基础 - 11 - 使用 Spring Boot Admin 监控应用状态 1 Spring Boot Actuator Spring Boot Act ...

  2. Oracle PLM,协同研发的产品生命周期管理平台

    官网:Oracle PLM - 方正璞华 适用企业:电子高科技.机械制造.医疗器械.化工行业等大型企业和中小型企业 咨询热线:4006-160-730 申请试用.预约演示.产品询价 邮箱:jiangc ...

  3. VUE:引入腾讯地图并实现轨迹动画

    腾讯位置服务JavaScript API 效果: 引入步骤: 在 html 中通过引入 script 标签加载API服务 在一个盒子元素 div 中预先准备地图容器,并在CSS样式中定义地图(容器)显 ...

  4. std:move() 作用 和 移动语义后 右值行为,unique_ptr的"移动"操作问题

    unique_ptr 不能进行赋值操作,但是可以有返回unique_ptr的函数,由此产生的问题: 结论1:std:move() 只是将一个实参强行转换为右值引用. 我们知道对象初始化时有 构造函数, ...

  5. 基于electron+vue+element构建项目模板之【改造项目篇】

    1.概述 开发平台OS:windows 开发平台IDE:vs code 上一篇中已完成了electron-vue项目的创建,本篇章中则介绍在此项目基础上进行取消devtools的安装.项目结构的改造. ...

  6. Prometheus样本采集器汇总

    系统基本信息 Linux Servers: Exporter https://github.com/prometheus/node_exporter Dashboard https://grafana ...

  7. Elasticsearch:Index生命周期管理入门

    如果您要处理时间序列数据,则不想将所有内容连续转储到单个索引中. 取而代之的是,您可以定期将数据滚动到新索引,以防止数据过大而又缓慢又昂贵. 随着索引的老化和查询频率的降低,您可能会将其转移到价格较低 ...

  8. 使用KVM的命令行方式安装centos7虚拟机

    前提条件 1.宿主机上已经安装KVM软件,参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/15538881.html 2.已经上传centos7镜像到宿主机里 ...

  9. google浏览器个人常用快捷键

    分享一下个人常用快捷键. 说明:字母排序规则遵循字母表(a->z) 快捷键 介绍 ctrl+0 恢复页面到100% ctrl+数字(1~9) 切换至序号对应的标签页 ctrl+d 将当前标签页添 ...

  10. Oracle基础知识汇总一

    Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接   https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...