力扣LeatCode算法题-两数之和(二)

news2024/11/24 13:48:14

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

要求:

//给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
//如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
//您可以假设除了数字 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 = 807
    public 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.十位相加+1
            if((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则向百位+1
        return sun;
    }


    //采用了符合leatcode题意的格式ListNode
     public 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);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业使用有线和5G主备双链路上网配置案例

场景介绍 典型的企业分支通常还是采用有线链路作为主链路&#xff0c;例如以太链路、MPLS专线等。为了提升分支站点的可靠性&#xff0c;企业一般都会部署两条上行链路&#xff0c;一条为主链路&#xff0c;一条为备链路。如果两条上行链路都采用有线&#xff0c;成本会比较高&…

JVM StringTable

文章目录学习资料StringTableString的基本特性String的内存分配StringTable为什么要调整&#xff1f;String的基本操作字符串拼接操作拼接操作与append操作的效率对比intern()的使用学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Ja…

prometheus exporter 监控主机

前提要求部署Grafana 前言 有许多库和服务器可以帮助将第三方系统中的现有指标导出为Prometheus指标。在无法直接使用Prometheus度量(例如&#xff0c;HAProxy或Linux系统统计数据)对给定系统进行检测的情况下&#xff0c;这是非常有用的。 node-exporter Linux操作系统采集&…

【Hack The Box】windows练习-- Scrambled

HTB 学习笔记 【Hack The Box】windows练习-- Scrambled &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

文章目录5.4 接口开发-根据id删除附件5.4.1 接口文档5.4.2 代码实现5.4.3 接口测试5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口5.4.4.1 阿里云OSS上传和删除5.4.4.2 FastDFS上传和删除5.4.4.3 Minio上传和删除5.5 接口开发-根据业务类型/业务id删除附件5.5.1 接口文档5.…

[附源码]SSM计算机毕业设计成都团结石材城商家协作系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

力扣(LeetCode)6. Z 字形变换(C++)

数学构造 ZZZ 字形变换类似情报加密。找规律解密&#xff0c;就能得到构造的方法。 第 000 行相邻的数&#xff0c;取 n4n4n4 如上图&#xff0c;观察第 000 行和第 333 行 相邻的数&#xff0c;组成等差数列&#xff0c;公差 d62n−2d62n-2d62n−2 2n−22n-22n−2 是说 &…

【小程序】微信小程序云开发笔记详细教程(建议收藏)

1- 前言 1.1 微信云开发是什么&#xff1f; 微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务。 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等&#xff0c;并且原生打通微信开放能力。 开发者无需搭建服务器&#xff0c;可免鉴权直接使用平台提供的…

Spring Cloud | 实现Eureka Server 高可用服务注册中心全套解决方案

目录1、在搭建Eureka Server&#xff0c;配置高可用服务注册中心&#xff0c;配置3个Eureka Server:2、因为是在本地实现的话&#xff0c;需要在localhost加入三个服务&#xff0c;需要改变etc/hosts&#xff0c;linux系统通过vim /etc/hosts&#xff0c;3、如果是在测试或者是…

最优孤岛划分下含分布式电源配电网可靠性评估附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

小学生python游戏编程arcade----坦克大战(1)

小学生python游戏编程arcade----坦克大战&#xff08;1&#xff09;前言坦克类&#xff0c;地图&#xff0c;角色的控制&#xff0c;声音等前期学习的汇总1、坦克类2、title地图加载2.1设置&#xff0c;tank类的引入2.2 角色的引入2.3 效果图2.4 代码实现总结源码获取前言 接上…

kafka学习之基本概念

一、kafka常用基本概念 producer&#xff1a;生产者&#xff0c;生产并发送消息的一方。 consumer&#xff1a;消费者&#xff0c;接收消费消息的一方。 topic&#xff1a;一类消息的集合。在kafka中&#xff0c;消息以主题为单位进行归类&#xff0c;producer负责将消息发送…

云服务器 宝塔部署SpringBoot前后端分离项目

&#x1f986;博主介绍&#xff1a;小黄鸭技术 &#x1f308;擅长领域&#xff1a;Java、实用工具、运维 &#x1f440; 系列专栏&#xff1a;&#x1f4e2;开发工具 Java之路 八股文之路 &#x1f4e7;如果文章写作时有错误的地方&#xff0c;请各位大佬指正&#xff0c;一起进…

舆情监控究竟是什么?怎么运作的?

本文首发于&#xff1a;行者AI谛听 随着互联网的加速变化&#xff0c;舆论已成为影响国家政治、社会生活和公众情绪的重要因素&#xff0c;也是影响企业形象和长远发展的重要因素。能及时收集精准措施以及预防减少和消除舆论带来的影响&#xff0c;是行业长远发展的关键条件。下…

泰凌微蓝牙 HCI层事件的注册和使用

Controler HCI event是通过HCI将Controller所有的event报告给Host HCI event是按BLE Spec标准设计的&#xff0c;是BLE Controller和Host用来交互的事件&#xff1b;GAP event是BLE host定义的一些协议栈流程交互时间通知型事件。 HCI event类型 #define HCI_EVT_DISCONNEC…

【Hack The Box】windows练习-- Object

HTB 学习笔记 【Hack The Box】windows练习-- Object &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1…

链表oj题(第一弹)

通过前两篇博客我们了解了链表的实现&#xff0c;那么今天我们来看看链表的oj题是如何完成的。 1、移除链表元素 题目要求我们删掉与val相同的节点。 方法一&#xff1a;我们可以写一个循环&#xff0c;首先创建两个节点&#xff0c;一个头节点&#xff0c;一个尾节点&#x…

Jmeter常用函数__V和__intSum

文章目录一、__V详解1、作用2、示例二、__intSum详解1、作用2、示例三、示例--随机用户名四、示例--随机对应的用户名和密码一、__V详解 1、作用 执行变量表达式&#xff0c;并返回执行的结果可以执行嵌套函数 2、示例 1、固定值和随机数组合 ${__V(1.${__Random(1,10,)})}…

[附源码]java毕业设计民宿客栈管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[Python]Django 模型

&#x1f349; 前言 系列文章目录 [Python]目录 文章目录&#x1f349; 前言&#x1f349; Django 模型&#x1f349; 定义模型&#x1f95d; 语法&#x1f95d; 常用模型字段类型&#x1f951; AutoField&#x1f951; BooleanField&#x1f951; NullBooleanField&#x1f95…