算法5: LeetCode_单链表_两数相加
- 题目:
- * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
- * 请你将两个数相加,并以相同形式返回一个表示和的链表。
- * 你可以假设除了数字 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_单链表_两数相加的更多相关文章
- C语言链表之两数相加
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- Leetcode算法系列(链表)之两数相加
Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...
- LeetCode :2.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- 用单向链表实现两数倒序相加(java实现)
很久没做算法题了,准备重操旧业,于是刷了一波LeetCode,看到一个比较经典的链表算法题,分享出来. 题目 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将 ...
- 两数相加(C#数据结构和算法练习)
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针
实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...
- Leetcode_两数相加_python
小编从今天起要开始分享一些Leetcode代码,通过好好练习编程能力,争取以后找一份好工作. 题目:两数相加 # Definition for singly-linked list. # class ...
- 【leetcode】 算法题2 两数相加
问题 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...
- leetcode 链表 两数相加
两数相加 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...
- Leetcode(2)-两数相加(包含链表操作的注意事项)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
随机推荐
- WinUI 3 踩坑记:从创建项目到发布
本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,若内容出现冲突以 GitHub 上的为准. 创建项目 现在 WinUI 3 的入门体验比刚 ...
- jumpserver设置某个用户登陆后,直接进入指定的服务器,不需要通过导航web终端--我的资产--服务器一连串的展开
ssh jumpserverUsername@systemUsername@AssetIP@jumpserverHostIP -p2222 解释: - jumpserverUsername:登录 Ju ...
- Elasticsearch:IK中文分词器
Elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze { "text": "我爱北京天安门&quo ...
- 关于MongoDB副本集和分片集群有关用户和权限的说明分析
1.MongoDB副本集 可以先创建超管用户,然后再关闭服务,创建密钥文件,修改配置文件,启动服务,使用超管用户登录验证,然后创建普通用户 2.MongoDB分片集群 先关闭服务,创建密钥文件,修改配 ...
- DevOps图示
- csv2ECharts,**一行命令查看数据趋势图 工具分享**
csv2ECharts 一行命令查看数据趋势图! 联系:luomgf@163.com,欢迎交流提出建议 只有一个文件,基于shell,实现将CSV格式数据转化为数据图.运维中尝尝需要查看某个监控指标的 ...
- Codeforces Round #710 (Div. 3)
emmm,就ac了3题 A题转换推下公式. tB题模拟,在第一个与最后一个变x后,直接i下标+k,判断当前下标前一个befor与最后一个last距离是否>k,是的话在当前下标往前找*字符然后改为 ...
- Hbase之理论
第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...
- springboot+vue 实现校园二手商城(毕业设计一)
1.功能划分 2.实现的效果 2.1 登录页面 2.2 注册页面 2.3 商城首页 2.4 商品详情 2.5 购物车 2.6 订单 2.7 在线交流 2.8 公告信息 2.9 个人信息 3.后台管理界 ...
- 3.版本穿梭&分支概述
版本穿梭 如果我们提交了多个版本到本地仓库,想将工作区恢复到历史版本 可以先使用git reflog查看历史记录,获取到版本号 然后使用git rest --hard 版本号 命令恢复到指定版本 gi ...