用单向链表实现两数倒序相加(java实现)
很久没做算法题了,准备重操旧业,于是刷了一波LeetCode,看到一个比较经典的链表算法题,分享出来。
题目
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 你可以假设除了数字 之外,这两个数字都不会以零开头。 示例: 输入:( -> -> ) + ( -> -> )
输出: -> ->
原因: + =
链表结构
class ListNode{
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
三个需要操作的链表图示(其实可以使用两个链表以节省空间,但是时间效率就会降低,题目没有定义链表长度)
这都是没有进位而且输入链表长度相同且结果不影响输出链表长度的情况,如果需要进位,或者输入链表的长度不同,那么也需要考虑进去。
思路
我们很容易想到就是从左往右依次遍历两个输入的List,对这两个List的Node对应加和,但是要注意的就是进位问题和这里的数字是反向的,注意进位判断,其实这个反向的条件对我们是有利的,因为这和我们平常加法算数是一致的,从低位到高位,这里只不过改成从左往右了,原理都是一样的。
还要注意输入链表的最后一个结点位置,我们用循环来遍历的时候就需要每一次都检查链表是不是最后一个结点,而且两个链表长度未必一样,注意空引用判断。
主要逻辑代码
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l4 = new ListNode(0);
ListNode l3 = new ListNode(0);
l4.next = l3; while(l1 != null || l2 != null){
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
//创建新的结点
ListNode l5 = new ListNode(0);
//进位
l5.val = (val1 + val2 + l3.val)/10;
//当前位
l3.val = (val1 + val2 + l3.val)%10; //如果是最后一次循环,且最后一位为0,那么就要除去这个结点
if(l5.val == 0 && (l1!= null ? l1.next:null) == null && (l2 != null ? l2.next : null) == null){
l3.next = null;
}else{
l3.next = l5;
l3 = l5;
} //跳转指针
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return l4.next;
}
测试代码
class ListNode{
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public class Test{ public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(3);
ListNode l3 = new ListNode(4);
l1.next=l2;
l2.next=l3;
l3.next = null;
ListNode l4 = new ListNode(5);
ListNode l5 = new ListNode(6);
ListNode l6 = new ListNode(4);
l4.next = l5;
l5.next = l6;
l6.next = null; printList(addTwoNumbers(l1,l4));
} public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l4 = new ListNode(0);
ListNode l3 = new ListNode(0);
l4.next = l3; while(l1 != null || l2 != null){
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
//创建新的结点
ListNode l5 = new ListNode(0);
//进位
l5.val = (val1 + val2 + l3.val)/10;
//当前位
l3.val = (val1 + val2 + l3.val)%10; //如果是最后一次循环,且最后一位为0,那么就要除去这个结点
if(l5.val == 0 && (l1!= null ? l1.next:null) == null && (l2 != null ? l2.next : null) == null){
l3.next = null;
}else{
l3.next = l5;
l3 = l5;
} //跳转指针
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return l4.next;
} public static void printList(ListNode l){
while(l!=null){
System.out.print("->");
System.out.print(l.val);
l = l.next;
}
}
}
用单向链表实现两数倒序相加(java实现)的更多相关文章
- leetCode:twoSum 两数之和 【JAVA实现】
LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...
- LeetCode01 - 两数之和(Java 实现)
LeetCode01 - 两数之和(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 题目描述 给定一个整数数组 ...
- C语言链表之两数相加
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现
[LeetCode] Add Two Numbers 两个数字相加 You are given two non-empty linked lists representing two non-ne ...
- leetcode刷题笔记-1. 两数之和(java实现)
题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...
- 用字符串模拟两个大数相加——java实现
问题: 大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求.可以使用字符串来表示大数,模拟大数相加的过程. 思路: 1.反转两个字符串,便于从低位到高位相加和最高位 ...
- leetcode实践:通过链表存储两数之和
题目: 两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的 ...
- [LeetCode]1.Two Sum 两数之和(Java)
原题地址:two-sum 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每 ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
随机推荐
- 修改Mysql5.7的root密码
Mysql5.7修改root密码 禁用root密码 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不 ...
- Python基础之面向对象进阶二
一.__getattribute__ 我们一看见getattribute,就想起来前面学的getattr,好了,我们先回顾一下getattr的用法吧! class foo: def __init__( ...
- jquery----Ajax补充
jquery实现ajax请求 <script> //$.ajax的两种使用方式: //$.ajax(settings); //$.ajax(url,[settings]); $(" ...
- poj2441状态压缩dp基础
/* 给定n头牛,m个谷仓,每头牛只能在一些特定的谷仓,一个谷仓只能有一头牛 问可行的安排方式 dp[i][j]表示前i头牛组成状态j的方案数,状态0表示无牛,1表示有牛 使用滚动数组即可 枚举到第i ...
- Android Studio 创建不恰当的虚拟设备导致程序不正常运行
操作系统:Windows 10 x64 IDE:Android Studio 3.2.1 使用Android Studio新建第一个Android程序,一开始在虚拟设备上面调试,不管程序怎么修改,运行 ...
- php模拟数据请求
php:模拟后台接受数据的步骤<?php> 1.连接数据库 $host="localhost"; $uname="root"; $upwd=&quo ...
- python 自动获取手机短信验证码
需要一个有权限的 APK 在手机实时存储短信到手机内存 /sdcard/smslog.txt 里(外部SD卡也可以知道能通过adb命令访问到): /***** ...... try {long tim ...
- Python深度学习案例2--新闻分类(多分类问题)
本节构建一个网络,将路透社新闻划分为46个互斥的主题,也就是46分类 案例2:新闻分类(多分类问题) 1. 加载数据集 from keras.datasets import reuters (trai ...
- Nginx中配置undertow进行两个项目的动静分离配置
#user nobody; worker_processes ; pid /var/run/nginx.pid; events { worker_connections ; } http { incl ...
- idea格式化代码无效Ctrl+Alt+L
1.Idea格式化代码,无效,我的原因是热键冲突,我按Ctrl+Alt+L的时候,竟然弹出了锁QQ,果断关了QQ的热键,百度有的是网易啥的,具体情况具体分析吧.