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

要求:

//给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
//如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
//您可以假设除了数字 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. [case19]聊聊eureka的TaskDispatcher
  2. 十天快速入门Python
  3. goland 创建工程(go mod)singo
  4. 计算机二级python分值_计算机二级python考试难吗
  5. Ubuntu | 使用 SecureCRT 远程登录 Ubuntu
  6. 6月共处理钓鱼网站8186个:非CN域名达8029个
  7. resharper警告 :linq replace with single call to FirstOrDefault
  8. ModuleNotFoundError: No module named '_tkinter'
  9. 《图解HTTP》— 安全的HTTPS
  10. 【OpenCV】—图像对比度、亮度值调整
  11. ERROR: Invalid requirement: ‘opencv-p-thon\xa0\xa0-i‘
  12. matlab确定分段函数的间断点,分段函数必有间断点( )
  13. 牛顿法求解柯西分布参数的最大似然估计(P055)
  14. echarts使用e_macarons方法
  15. 前端大串讲,狂神,狂神和飞哥
  16. 男程序员怎么过妇女节
  17. google map api key申请
  18. Anaconda安装
  19. java计算机毕业设计springboot+vue中国古诗词网站(源码+系统+mysql数据库+Lw文档)
  20. 光谷计算机专业好的学校,华一寄、华一初、华一光谷哪所学校更好(综合对比)...

热门文章

  1. 国内服务器sillyGirl傻妞对接TG机器人
  2. androidstudio连接网易MUMU模拟器
  3. 《Spring源码深度解析 郝佳 第2版》JDBC、MyBatis原理
  4. Java 8 HashMap 详解
  5. 华科计算机考研分数分布,华科计算机考研分数线
  6. java中级招聘要求怎么写_招聘JAVA初级中级程序员!
  7. html中头部相关标签(<head>)基本概念
  8. linux中的inode文件编号和软硬链接
  9. 教你如何用50行(算单行括号)简单代码在黑框框看短视频(附上完整代码)
  10. 【华为笔试】安排面试官。有M个面试官,每个面试官熟悉的编程语言是一个列表,有N个面试者,按照面试者的机试选择的语言分配面试官进行面试(Python)