• 题目:
  • * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
  • * 请你将两个数相加,并以相同形式返回一个表示和的链表。
  • * 你可以假设除了数字 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. 《Java Web程序设计——开发环境搭建》

    Java Web程序设计--开发环境搭建       一.JDK下载.安装以及环境变量的配置: 官网:https://www.oracle.com/java/technologies/download ...

  2. 在云原生中监控JVM指标

    一般 Java 集成 Prometheus 监控指标有两种方式.一种是依赖中引入,另外一种是通过agent执行. 依赖引入 <!-- The client --> <dependen ...

  3. cAdvisor容器监控规则

    其他说明参考host主机监控规则:https://www.cnblogs.com/sanduzxcvbnm/p/13589848.html 在prometheus主程序目录下的rules目录下新建do ...

  4. 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案

    大家好,又见面了. 不知道下面这玩意大家有没有见过或者使用过?这是一个插座转换器.我们都知道日常使用的是220v的交流电,而国外不同国家使用的电流电压是不一样的(比如日本使用的是110v).且插座的接 ...

  5. 洛谷P1638 逛画展 (尺取法)

    尺取法的经典题目: 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所 ...

  6. 洛谷P2216 HAOI2007 理想的正方形 (单调队列)

    题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护. 但是二维平面上单调队列怎么用? 我们先对行处理 ...

  7. NOIP2015 普及组 洛谷P2671 求和 (数学)

    一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...

  8. AT&T汇编语法与x86语法基本区别

    AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部 ...

  9. 通过刷题HTML遇到的问题

    通过刷题HTML遇到的问题 1.有关选择器的权重问题 1.通配符选择器和继承:权重为0, 2.标签选择器:权重为0001 3.类选择器:权重为0010 4.id选择器:权重为0100 5.行内样式:权 ...

  10. HTML+CSS基础知识(5)相对定位、绝对定位、固定定位

    文章目录 1.相对定位 1.1 代码 1.2 测试结果 2.绝对定位 2.1 代码 2.2 测试 3.固定定位 3.1 代码 3.2 测试结果 1.相对定位 1.1 代码 <!DOCTYPE h ...