算法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 -& ...
随机推荐
- 在工作组的环境中配置Windows 2012 R2的远程桌面服务
在工作组的环境中配置Windows 2012 R2的远程桌面服务 How to configure Remote Desktop Service in Windows 2012 R2 workgrou ...
- Django提交时报错
错误描述: RuntimeError at /saveBlog You called this URL via POST, but the URL doesn't end in a slash and ...
- Linkerd、Consul、Istio、Kuma、Traefik、AWS App服务网格全方位对比
- 开启tcp_timestamps和tcp_tw_recycle造成NAT转发连接不上
文章转载自:https://segmentfault.com/a/1190000022264813
- 在 WPF 中实现融合效果
1. 融合效果 融合效果是指对两个接近的元素进行高斯模糊后再提高对比度,使它们看上去"粘"在一起.在之前的一篇文章中,我使用 Win2D 实现了融合效果,效果如下: 不过 Win2 ...
- 关于aws的ec2实例导出成ova后在vmware中的网络配置不生效的问题
在aws上的ec2实例,尤其是使用了aws市场中的ami创建的linux系统,默认情况下,网络配置都是通过dhcp自动获取的, 这周笔者将一台ec2实例(redhat/linux 8.3)导出/转换成 ...
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
一.概述 在实际开发中,大部分情况下都不是在单表中进行数据操作,一般都是多张表进行联合查询.通常一个业务就会对应的有好几张表.MySql中的连接查询分为交叉连接,内连接,外连接三部分.其中交叉连接也叫 ...
- 谣言检测(DUCK)《DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks》
论文信息 论文标题:DUCK: Rumour Detection on Social Media by Modelling User and Comment Propagation Networks论 ...
- Hbase之权限控制
Hbase之权限控制 -- 只读权限 grant '{userName}','R','{namespaceName:tableName}' -- 写入权限 grant '{userName}','W' ...
- NOI2011阿狸的打字机
题目链接 昨天晚上yy出了一个做法后,感觉...好难打啊...,于是先回去休息.今天来打时,还是感觉细节好多,于是就打了两个小时.打完过了编译后,居然过了样例,直接交,尼玛居然过了???......还 ...