2_两数相加

简介: 2_两数相加

2_两数相加

 

package 链表;
/**
 * https://leetcode-cn.com/problems/add-two-numbers/
 * 
 * @author Huangyujun
 */
public class _2_两数相加 {    
// 题目例子:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
//输出:[8,9,9,9,0,0,0,1], 可以看到有进位这种东西
/**
 * 自己尝试的递归(不香,写到一半放弃了)
 * @param l1
 * @param l2
 * @return
 */
//    public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
//        if(l1 == null && l2 == null)    return null;
//        //其中一个长度为 0 
//        if(l1 == null && l2 != null)    return l2;
//        if(l1 != null && l2 == null)    return l1;
//        
//        ListNode l = addTwoNumbers2(l1.next, l2.next);
//        //剩下 l1 和 l2
//        int sum = l1.val + l2.val;
//        int carry = sum / 10;
//        ListNode head = null;
//        if(carry < 0) {
//            head = new ListNode(sum);
//            head.next = l;
//        }else {//进位的话,需要进行传递
//            int val = sum % 10;
//            head = new ListNode(val);
//            ListNode temp = l;
//            while(temp != null) {//这里边也需要考虑又再次进位了,递归不香了
////                temp.val
//            }
//        }
//        return head;
//    }
    //官网的方法:官网用 || 把链表是否为空的所有情况都考虑
    //(我是详细的分成四种情况 l1、l2同时为空; 11 为空,12 不为空; l1不为空,l2 为空; l1 、 l2 同时不为空)
    //而且我分析到 l1 、 l2 同时不为空 时,使用while(l1 != null && l2 != null), 后边就还得再次考虑 l1 (l2)链表还有剩下结点没有被访问到呢
     /**
      * 官网的框架:
        while (l1 != null || l2 != null){
                   if (l1 != null) {    
                     l1 = l1.next;
                 }
                 if (l2 != null) {
                     l2 = l2.next;
                 }        
         }
         比我的框架少写了好多重复代码啦
      * @author Huangyujun
      *
      */
     //然后 在 || 的情况下,拿到头结点的初始值(经过是否为空,空的初始值 为 0,否则就是头结点的值)
     class Solution2 {
         public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
             ListNode head = null, tail = null;    //从无到有,硬生生构建出一条链表(需要有两个指针(或者一个头结点和一个指针):其中一个指针用来实现遍历到下一个位置去创建结点,然后next 连起来,一个就是head啦)
             int carry = 0;
             while (l1 != null || l2 != null) {
                 //拿到头结点的初始值(经过是否为空,空的初始值 为 0,否则就是头结点的值)
                 int n1 = l1 != null ? l1.val : 0;
                 int n2 = l2 != null ? l2.val : 0;
                 int sum = n1 + n2 + carry;
                 if (head == null) {    //构建第一个结点时
                     head = tail = new ListNode(sum % 10);
                 } else {
                     tail.next = new ListNode(sum % 10);
                     tail = tail.next;
                 }
                 carry = sum / 10;
                 if (l1 != null) {    
                     l1 = l1.next;
                 }
                 if (l2 != null) {
                     l2 = l2.next;
                 }
             }
             if (carry > 0) {    //最后一位的考虑
                 tail.next = new ListNode(carry);
             }
             return head;
         }
     }
    //自己写的就是代码太啰嗦了(思路跟官网一样)
     public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        if(l1 == null && l2 == null)    return null;
        if(l1 == null && l2 != null)    return l2;
        if(l1 != null && l2 == null)    return l1;
        ListNode ptr1 = l1;
        ListNode ptr2 = l2;
        ListNode head = new ListNode(0);
        ListNode tmp = head;
        int carry = 0;
        int sum = 0;
        while(ptr1 != null && ptr2 != null) {
            sum = ptr1.val + ptr2.val + carry;    //考虑到进位的情况
            //考虑进位
            carry = sum / 10;
            sum %= 10;
            ListNode p = new ListNode(sum);
            tmp.next = p;
            tmp = p;
            ptr1 = ptr1.next;
            ptr2 = ptr2.next;
        }
        while(ptr1 != null) {
            //tmp 继续走
            sum = ptr1.val + carry;    //考虑到进位的情况
            carry = sum / 10;
            sum %= 10;
            ListNode p = new ListNode(sum);
            tmp.next = p;
            tmp = p;
            ptr1 = ptr1.next;
        }
        while(ptr2 != null) {
            //tmp 继续走
            sum = ptr2.val + carry;    //考虑到进位的情况
            carry = sum / 10;
            sum %= 10;
            ListNode p = new ListNode(sum);
            tmp.next = p;
            tmp = p;
            ptr2 = ptr2.next;
        }
        if(carry != 0){//最后一位处理
            ListNode p = new ListNode(carry);
            tmp.next = p;
        }
        return head.next;
    }
}
目录
相关文章
|
4天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
7天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
413 93
|
23小时前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
267 2
|
7天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
405 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
6天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
300 158