很久没做算法题了,准备重操旧业,于是刷了一波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;

}

}

}

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 链表 两数相加

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

LeetCode(2):Add Two Numbers 两数相加

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

随机推荐

【leetcode】Palindrome Number

题目简述: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could n ...

[翻译]-马丁·福勒-page对象

译者注:这篇文章翻译自马丁·福勒(Martin Flower,对,没错,就是软件教父)官网的一篇文章,原文出处在文底.如果你正在做WEB自动化测试,那么我强烈推荐你看这篇文章.另外透露Martin F ...

IOS中的多核并发编程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...

Linux Curses编程实现贪吃蛇

curses库 简单而言,提供UNIX中多种终端 操作光标和显示字符 的接口.我们常见的vi就是使用curses实现的.现在一般都用ncurses库. Linux下curses函数库    Linux ...

Oracle和Mysql分别生成sequence序列

有时候在往数据库中插入数据的时候,如果ID值是32位的UUID, 而自己随便写个字符又不合适,这时就要用到函数来产生一个序列值 Oracle: select sys_guid() from dual; ...

JS自动刷新页面一次

Linux学习 -- 备份与恢复

备份 Linux系统需要备份的数据 /root/ /home/ /var/spool/mail /etc/ others 备份策略 完全备份 增量备份 差异备份 备份和恢复命令 dump  resto ...

JavaScript截取字符串的Slice、Substring、Substr函数简单比较还有indexof函数应用

//截取字符,一看就明白!!! var str = "0123456789"; alert(str.substring(5)); 弹出 //56789 alert(str.subs ...

iOS-OC、Swift 混编之桥接文件

新建一个OC语言的项目,然后添加一个基于NSObject的Swift文件SwiftFileModel类 .swift import UIKit class SwiftFileModel: NSObje ...

【P2577】 午餐

题目简述 THU ACM小组一行N个人去食堂吃饭,计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭.每个人打完饭后立刻开 ...

java三位整数倒序相加_用单向链表实现两数倒序相加(java实现)相关推荐

  1. matlab求一个数的位数字,matlab求一个三位整数各位数字的立方和等于该数本身则称为...

    用C语言随机产生一个三位整数 思路:分别产生个.十.百位上的随机数,依次组合在一起#include#include#includeintmain(){inti,tmp;num=0;srand((uns ...

  2. Java黑皮书课后题第3章:**3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票。程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金

    **3.15(游戏:彩票)修改程序清单3-8,产生三位整数的彩票.程序提示用户输入一个三位整数,然后依照规则判定用户是否赢得奖金 题目 题目概述 破题 代码 题目 题目概述 **3.15(游戏:彩票) ...

  3. Java语言中 (游戏:彩票)修改程序清单3-8,产生三位整数的彩票。程序提示用户输入一个三位整数,依照以下规则判定用户是否赢得奖金:

    游戏:(彩票)修改程序清单3-8,产生三位整数的彩票.程序提示用户输入一个三位整数,然后依照以下规则判定用户是否赢得奖金: (1)如果用户输入的所有数包括顺序完全匹配彩票数字,奖金是10 000美元 ...

  4. 输入一个三位整数,求出该数字各个位的数字之和

    #include<stdio.h> int main() {int a,b,c,e,f;printf("请输入一个三位整数:");scanf("%d" ...

  5. C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出。

    C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出. #include <stdio.h> #include <math.h> void ...

  6. python输入一个三位数、输出它的逆序数值_c语言 从键盘输入一个三位数,输出该数的逆序数。c语言中从键盘输入一个三位整数...

    c语言 从键盘输入一个三位数,输出该数的逆序数. c语言中从键盘输入一个三位整数 www.zhiqu.org     时间: 2020-12-08 c语言中从键盘输入一个三位数,输出该数的逆序数,可以 ...

  7. python反转一个三位整数的多种方法

    反转一个三位整数的多种方法 在LintCode上练习遇到这个问题,查阅资料找到多种方法,总结如下. 输入 输出 123 321 第一种:整数方法取余取整实现 class Solution:" ...

  8. 例1-反转一个三位整数

    问题描述: 反转一个3位整数. 问题示例: 输入 number=123,输出321:输入 number=900,输出9. 代码实现: class Solution:#参数number:一个三位整数#返 ...

  9. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

最新文章

  1. RapidFramework使用Oracle的步骤
  2. Django1.11 扩展User属性增加头像上传功能
  3. spring整合springmvc和mybatis
  4. 第一次使用HP-UX时用到的命令
  5. python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波
  6. SIMD学习 -- 用SSE2指令作点乘和累加计算
  7. spring mvc hello
  8. mysql常用的hint
  9. idea conf文件_JavaWe商品项目保姆级解析IDEA版(配置篇)
  10. php小程序群发通知,小程序实现群发功能代码的实现
  11. [react] Mern和Yeoman脚手架有什么区别?
  12. 在android中如何使用UDP和TCP传输
  13. 你的袜子还是干的吗?
  14. 《Linux内核修炼之道》——2.2 编译内核
  15. RestClient
  16. d3中元素拖拽drag实例
  17. URL.createObjectURL()方法
  18. 互联网赚钱的逻辑是什么?
  19. 微信小程序swiper上下滑动卡顿
  20. 由FREENOS看去

热门文章

  1. 使用vertx构建响应式微服务-第三章 创建响应式微服务(Building Reactive Microservices)
  2. TBOX定位测试-如何用Excel分析对比RTK数据
  3. VOCs环保设备在线监测系统
  4. 通达信l1l2行情接口具体有什么区别?
  5. 数学建模预测模型实例(三)---双色球概率预测模型
  6. windows 定义计划任务脚本
  7. 巨坑!监听浏览器窗口关闭onbeforeunload不起作用(脱坑了啊!!)
  8. 「民工哥技术之路」截止2019年12月31日所有文章集合
  9. thinksns解析1
  10. 以太网接口 数据采集 matlab,基于以太网的远程数据采集系统