Leetcode 原题,两数相加,细到极致

  最近,闲来无事,随便瞄了一下Leetcode,然后有个题目,看到了比较感兴趣,所以,就自不量力学习了一下。
  这个题目是: 给你两个非空的链表表示两个非负的整数它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表
在这里插入图片描述
看到这个题目,我本身是没有什么思路的,谁让我是一个菜鸡呢!没办法,只能阅读大佬们的代码,然后经过N次Debug,终于看懂了,现在我来演示一下,这个题目的解决方案
闲话懒得扯了,直接贴代码

package com.uci.java06;

/**
 * @author: Jessica
 * @date: 2022-01-26 14:34
 * @desc:
 *
 * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
 * 请你将两个数相加,并以相同形式返回一个表示和的链表
 *
 * 链接:https://leetcode-cn.com/problems/add-two-numbers
 **/

class Solution {

    /**
     * 先说下思路吧,其实就是小学题目,加法运算
     * 一个数和另外一个数 倒着相加,得到807,然后把结果拆成单个数字
     * 最后倒着回去,形成链表,变成 7=>0=>8=>null
     */
    public static void main(String[] args) {
        ListNode l1 = new ListNode(243);
        ListNode l2 = new ListNode(564);

        ListNode listNode = addTwoNumbers(l1, l2);
        System.out.println(listNode);
    }

    //定义一个静态内部类,为什么要定义呢,是为了方便,不需要借助其他包
    static class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }

        @Override
        public String toString() {
        //这句的意思是 ListNode cur= ListNode{val:xx,next{zzz}},拿到ListNode对象
        ListNode cur = this;
            String toString = "";
            while (cur != null){  //先取出第一个val,然后将当前cur的next给到cur,递归取出val
                toString += (cur.val + "=>");
                cur = cur.next;
            } //拼接打印
            return toString + "null";
        }
 }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //老实说,第一次看,有点懵逼,为什么要定义一个0呢,后来想了一下
        //有参构造总得传个参数吧,int 只能给0
        ListNode root = new ListNode(0);
        ListNode cursor = root;
        int carry = 0;//两个数相加以后,拆分需要一个变量,存放还没有拆掉的数
        while(l1 != null || l2 != null || carry != 0) {
            int l1Val = l1 != null ? l1.val : 0;
            int l2Val = l2 != null ? l2.val : 0;
            int sumVal = l1Val + l2Val + carry;//相加,没啥好说的
            carry = sumVal / 10;//依次得到80,8

            //sumVal % 10 会得到7,0,8,null,然后依次加入新链表,
            ListNode sumNode = new ListNode(sumVal % 10);
            
            //这个地方是最关键的地方,我之前认为ListNode cursor = root;是无效代码,完全可以root.next=sumNode
            //后来我发现,不行,就是在这个地方,需要一个临时的变量 cursor,去更新root.next
            //第一次cursor.next 为 val:7,next:null,然后cursor和root相等,顺便更新root.next
            cursor.next = sumNode;
            //sumNode为 val:7,next:null,将cursor.next重新置为空
            cursor = sumNode;

            /**
             * 上面两行代码,就是想做一件事情,往root.next递归赋值
             */
            
            //第一次循环,其实就已经把l1,l2 置为空了
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        //返回  root.next=7,0,8
        return root.next;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesscia ^_^

您的打赏将是我努力的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值