【算法之旅】(No.2-两数之和) | Java刷题打卡

简介: 【算法之旅】(No.2-两数之和) | Java刷题打卡

题目描述


输入参数:


表示两个非负的整数。,。

  • 两个非空的链表
  • 节点数量范围:[1, 100]
  • 0 <= 节点数值 <= 9




题目逻辑:

  • 返回请你两个链表内的元素对应位置进行相加,并以相同形式返回一个表示和的链表



输出结果:

  • 返回一个表示两数和的链表




特别说明:


  • 规则:它们每位数字都是按照逆序的方式存储的
  • 规则:并且每个节点只能存储一位数字
  • 规则:除了数字0之外,这两个数都不会以 0 开头



题目示例


示例 1

image.png




输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
复制代码



示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
复制代码



示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
复制代码




思路分析

我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。


image.png




就像你在纸上计算两个数字的和那样,我们计算两个数字的和时可能会出现 “溢出”。



  • 例如,5 + 7 = 12。在这种情况下,我们会将当前位的数值设置为 2,并将进位 carry = 1带入下一次迭代。


  • 进位 carry必定是 0 或 1,这是因为两个数字相加(考虑到进位)可能出现的最大和为 9 + 9 + 1 = 19。



值得注意的 两个链表的长度不一定相同 故有可能存在一个链表走完 另一个链表还未走完的情况,故走完的链表还要将其值赋值为0,直至两个链表都走到Null




AC代码


实现方法1

class Solution {
/* 
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p=new ListNode(-1);
        //创建一个新的结点
        ListNode res=p;
        int st=0;//标志位
        while(l1!=null || l2!=null){
            //当l1为空结点的时候 防止取空 赋值为0 便于高位相加 同理l2
            int x= l1==null? 0:l1.val;
            int y= l2==null ?0:l2.val;
            //相加后的值
            int temp=(x+y+st);
            //个位上的数字
            int value=temp%10;
            //产生新结点 进行拼接
            ListNode q=new ListNode(value);
            p.next=q;
            p=p.next;
            //得到进位
            st=temp>=10?1:0;
            //当结点为null不前进
            l1= l1==null? l1:l1.next;
            l2= l2==null? l2:l2.next;
        }
        if(st==1){
            ListNode q=new ListNode(st);
            p.next=q;
        }
        return res.next;
    }
}
复制代码



实现方法2(简易版)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int carry = 0;
        ListNode dummy = new ListNode(-1);
        ListNode cur = dummy;
        while (l1 != null || l2 != null || carry != 0) {
            int s = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val)
            + carry;
            carry = s / 10;
            cur.next = new ListNode(s % 10);
            cur = cur.next;
            l1 = l1 == null ? null : l1.next;
            l2 = l2 == null ? null : l2.next;
        }
        return dummy.next;
    }
}
复制代码




总结:


  1. 逻辑的算法实现较为简单:主要思路就是依靠遍历链表,所以大家一定要对链表的结构和遍历以及维护的机制有着比较熟悉的概念。


  1. 需要多多考虑相关进位方式考虑进位向前以为进行处理。【0,19】


  1. 如果存在两个链表的长度不一致,要考虑null的处理,转换为0的处理机制。





相关文章
|
3月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
435 35
|
8月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
8月前
|
存储 缓存 监控
上网行为监控系统剖析:基于 Java LinkedHashMap 算法的时间序列追踪机制探究
数字化办公蓬勃发展的背景下,上网行为监控系统已成为企业维护信息安全、提升工作效能的关键手段。该系统需实时记录并深入分析员工的网络访问行为,如何高效存储和管理这些处于动态变化中的数据,便成为亟待解决的核心问题。Java 语言中的LinkedHashMap数据结构,凭借其独有的有序性特征以及可灵活配置的淘汰策略,为上网行为监控系统提供了一种兼顾性能与功能需求的数据管理方案。本文将对LinkedHashMap在上网行为监控系统中的应用原理、实现路径及其应用价值展开深入探究。
198 3
|
8月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
325 0
|
3月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
7月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
470 58
|
6月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
107 4
|
6月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
212 1
|
5月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
211 0