力扣算法题第二题,两数相加算法题:

要求:

//给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
//如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
//您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
//示例:
//输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
//输出:7 -> 0 -> 8
//原因:342 + 465 = 807

很多时候不是做不出题目,而是题意没有审清。

我们再来看下题目要求:

我们所指的的个位是在链头,百位是在链尾,所以思路是要转过来。

使用了最简单的一种,不考虑0和超过百位的算法。

public static ListNode addTwoNumbers1(ListNode l1, ListNode l2) {//创建一个和值ListNode sun_end = new ListNode(-1,new ListNode(-1,new ListNode(-1)));//测试数据:[1,2,3] [1,9,9]if((l1.val+l2.val)>=10 ){//1.判断个位,个位相加>10,个位进位,十位+1。sun_end.val=l1.val+l2.val-10;//2.十位相加if((l1.next.val+l2.next.val+1)>=10){//十位进位sun_end.next.val =l1.next.val+l2.next.val+1-10;//3.百位相加,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val+1;}else{//个位进位,十位不进位,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val+1;//十位不进位,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val;}}else {//判断个位,个位相加<10,个位不进位,十位不加1。//1.1 否则个位相加不进位,只考虑相加在3位数以内sun_end.val=l1.val+l2.val;//2.十位相加if((l1.next.val+l2.next.val+1)>=10){//个位相加不进位,十位进百位sun_end.next.val =l1.next.val+l2.next.val-10;//3.百位相加,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val+1;}else{//个位不进位,十位不进位,默认百位不进位sun_end.next.val =l1.next.val+l2.next.val;//十位不进位,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val;}}System.out.println("sun1="+sun_end.val);System.out.println("sun2="+sun_end.next.val);System.out.println("sun3="+sun_end.next.next.val);return sun_end;}

以上这种办法只适用于两个都是百位数相加,且和不超过千位,无法通过leatcode算法考验。

所以整合出第三种办法:

循环进制计算法

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {//创建一个和值ListNode sun_header = new ListNode(-1);ListNode sun_end = sun_header;//用来调整链接指针下标的next指向int carry =0;//用来标识进位//用一个while循环去判断“个十百”位相加是否大于10,while (l1!=null || l2!=null || carry !=0){if(l1!=null){carry+=l1.val;l1=l1.next;}if(l2!=null){carry+= l2.val;l2=l2.next;}sun_end.next=new ListNode(carry%10);//取余: 比如个位6+6=12%=2,个位=2,十位=1.sun_end=sun_end.next;//移动下一个节点sun_end有三个链结构carry/=10;//超过1则进位器+1。=0则不进位//sun_end.val=carry%10;}System.out.println("sun1="+sun_header.next.val);System.out.println("sun2="+sun_header.next.next.val);System.out.println("sun3="+sun_header.next.next.next.val);return sun_header.next;//sun_header有四个链结构}

这段代码如果要在leatcode上运行,需要去掉static静态方法。因为这是我在idea上测试写的方法。

大家理解起来很抽象。我画图给大家解释下。

每一个listNode就相当于一个回形针(ListNode sun_header = new ListNode(-1)),每个回形针是 listNode。

第一个回形针取值直接用var取值,如:l1.var = 2;

第二个回形针取值直接用l1.next.var,需要next移动到下一个回形针上,如:l2.next.var=6

第四个回形针取值则用3个next。如: sun_header.next.next.next.var=8.

就这么简单,低位相加>10,就进位。

附上所有代码,可以在任何编译器中运行。

package com.zhm.test;import org.junit.Test;import java.util.Arrays;/*** @Author bige* @Date: 2022/11/16 18:11* @ApiNote:两数相加*/
public class Leatcode_test2 {//给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。//如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。//您可以假设除了数字 0 之外,这两个数都不会以 0 开头。//示例://输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)//输出:7 -> 0 -> 8//原因:342 + 465 = 807public static int[] addTwoNumbers(int[] l1, int[] l2) {//测试数据:[1,2,3] [1,9,9]//int[] sun =new int[5];int[] sun =new int[l1.length];//想法和思路//1.个位相加>10则向10位if((l1[l1.length-1]+l2[l2.length-1])>10){sun[l1.length-1] =l1[l1.length-1]+l2[l2.length-1]-10;//2.十位相加+1if((l1[l1.length-2]+l2[l2.length-2]+1)>10){//十位进位sun[l1.length-2] =l1[l1.length-2]+l2[l2.length-2]+1-10;//3.百位相加,默认百位不进位sun[l1.length-3] =l1[l1.length-3]+l2[l2.length-3]+1;}else{//个位进位,十位不进位,默认百位不进位sun[l1.length-2] =l1[l1.length-2]+l2[l2.length-2]+1;//十位不进位,默认百位不进位sun[l1.length-3] =l1[l1.length-3]+l2[l2.length-3];}}else {//1.1 否则个位相加不进位,只考虑相加在3位数以内sun[l1.length] =l1[l1.length]+l2[l2.length];//2.十位相加if((l1[l1.length-2]+l2[l2.length-2]+1)>10){//个位不进位,十位进位sun[l1.length-2] =l1[l1.length-2]+l2[l2.length-2]-10;//3.百位相加,默认百位不进位sun[l1.length-3] =l1[l1.length-3]+l2[l2.length-3]+1;}else{//个位不进位,十位不进位,默认百位不进位sun[l1.length-1] =l1[l1.length-1]+l2[l2.length-1];//十位不进位,默认百位不进位sun[l1.length-2] =l1[l1.length-2]+l2[l2.length-2];}}//2.十位相加>10则向百位+1return sun;}//采用了符合leatcode题意的格式ListNodepublic static 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 static ListNode addTwoNumbers1(ListNode l1, ListNode l2) {//创建一个和值ListNode sun_end = new ListNode(-1,new ListNode(-1,new ListNode(-1)));//测试数据:[1,2,3] [1,9,9]if((l1.val+l2.val)>=10 ){//1.判断个位,个位相加>10,个位进位,十位+1。sun_end.val=l1.val+l2.val-10;//2.十位相加if((l1.next.val+l2.next.val+1)>=10){//十位进位sun_end.next.val =l1.next.val+l2.next.val+1-10;//3.百位相加,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val+1;}else{//个位进位,十位不进位,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val+1;//十位不进位,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val;}}else {//判断个位,个位相加<10,个位不进位,十位不加1。//1.1 否则个位相加不进位,只考虑相加在3位数以内sun_end.val=l1.val+l2.val;//2.十位相加if((l1.next.val+l2.next.val+1)>=10){//个位相加不进位,十位进百位sun_end.next.val =l1.next.val+l2.next.val-10;//3.百位相加,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val+1;}else{//个位不进位,十位不进位,默认百位不进位sun_end.next.val =l1.next.val+l2.next.val;//十位不进位,默认百位不进位sun_end.next.next.val =l1.next.next.val+l2.next.next.val;}}System.out.println("sun1="+sun_end.val);System.out.println("sun2="+sun_end.next.val);System.out.println("sun3="+sun_end.next.next.val);return sun_end;}public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {//创建一个和值ListNode sun_header = new ListNode(-1);ListNode sun_end = sun_header;//用来调整链接指针下标的next指向int carry =0;//用来标识进位//用一个while循环去判断“个十百”位相加是否大于10,while (l1!=null || l2!=null || carry !=0){if(l1!=null){carry+=l1.val;l1=l1.next;}if(l2!=null){carry+= l2.val;l2=l2.next;}sun_end.next=new ListNode(carry%10);//取余: 比如个位6+6=12%=2,个位=2,十位=1.sun_end=sun_end.next;//移动下一个节点sun_end有三个链结构carry/=10;//超过1则进位器+1。=0则不进位//sun_end.val=carry%10;}System.out.println("sun1="+sun_header.next.val);System.out.println("sun2="+sun_header.next.next.val);System.out.println("sun3="+sun_header.next.next.next.val);return sun_header.next;//sun_header有四个链结构}public static void main(String[] args) {//采用数组格式去测试int[] l1={1,2,3};int[] l2={1,2,9};//int[] result = addTwoNumbers(l1,l2);//System.out.println(Arrays.toString(result));//采用单链表格式去测试数据//ListNode newHead = new ListNode(-1);ListNode list1 = new ListNode(2,new ListNode(4,new ListNode(3)));ListNode list2 = new ListNode(5,new ListNode(6,new ListNode(4)));//System.out.println(list1.toString());//addTwoNumbers1(list1,list2);addTwoNumbers(list1,list2);}
}

力扣LeetCode算法题第2题-两数之和(二)相关推荐

  1. 领扣LintCode算法问题答案:56. 两数之和

    56. 两数之和 描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 ...

  2. 【算法】哈希表 ( 两数之和 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  3. python【力扣LeetCode算法题库】220-存在重复元素 III

    给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...

  4. python【力扣LeetCode算法题库】219 -存在重复元素 II

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示例 1: 输入: nums = ...

  5. python【力扣LeetCode算法题库】217-存在重复元素

    给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: 输入: [1,2,3,1] 输出: true ...

  6. python【力扣LeetCode算法题库】257- 二叉树的所有路径

    给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / 2 3 5 输出: ["1->2->5", &quo ...

  7. python【力扣LeetCode算法题库】10-正则表达式匹配

    给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 ...

  8. 力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!

    文章目录 3.数组中重复的数字 4.二维数组中的查找 5.替换空格 6.从尾到头打印链表 7.重建二叉树 9.两个栈来实现一个队列 10-1.斐波那契数列 10-2.跳台阶 11.旋转数组的最小数字 ...

  9. Leetcode刷题(1)两数之和

    最好的种树是十年前,其次是现在.歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主  放弃很容易但是坚持一定很酷     我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的 ...

最新文章

  1. UNITY相关的一些新功能,新想法
  2. GWT HTTP请求替代
  3. sqlite3用python家外键_Django/Sqlite3为带有外键的模型添加一行
  4. 基于SWT的Sash和FormLayout的自定义分隔窗体
  5. Rust: Integers: Recreation One
  6. oracle 查询有字母,oracle中查询含字母的数据[正则表达式]
  7. mysql数据库客户端--navicat for mysql 12中文破解版64位/32位 v12.0.29
  8. QT小项目练手——用QTimer做一个倒计时程序
  9. Animation动画详解
  10. A站、B站、C站、D站、E站、F站、G站、H站、I站、J站、K站、L站、M站、N站、T站…Z站 ?
  11. 最新版(2019.3.23)荣耀paly真机调试(Android stdio)
  12. 20道大厂真实面试题,答出一半以上的都是高手
  13. mfc程序退出时删除托盘图标
  14. apache实验报告 linux_linux实验报告心得
  15. 加强版RFM模型,轻松扒出B站优质up主!
  16. 测试基础:测试用例设计方法
  17. android系统浏览器下载流程
  18. 谷歌art和华为方舟编译器_Google Art Project – Chrome扩展程序
  19. 什么是裸纤、专线、SDH、MSTP、MSTP+、OTN、PTN-Vecloud微云
  20. 安装centos7显示器分辨率不适配的解决办法

热门文章

  1. Telegram之创建机器人
  2. 企业微信自动加人机器人
  3. 一木.溪桥学Python-02: 数据类型、标识符、语句与缩进、变量常量、输入input、sep=“ “、end=“\n“
  4. mac mysql my.cnf无效_mac 中 mysql 配置my.cnf无效解决办法-Go语言中文社区
  5. unzip解压所有zip格式
  6. Lock与ReentrantLock
  7. dokuwiki中文linux,Linux 下面 Dokuwiki 安装 - Dokuwiki 中文教程
  8. 【VBA研究】如何简单的汇总一年12张Excel工资表
  9. C语言检测名字中的元音字符,C程序检查字符是否是元音
  10. JavaWeb 富文本编辑器(Ckeditor)文件上传