当前位置: 首页 > news >正文

LeetCode02 - 两数相加(Java 实现)

LeetCode02 - 两数相加(Java 实现)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

Java 实现与实现思路

/**
 * <p>
 * 02: 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
 * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 *
 * @author XiaoPengwei
 * @since 2019-07-14
 */
public class LeetCode02TwoAdd {

    public static void main(String[] args) {

        // 链表 1
        ListNode list1Node1 = new ListNode(2);
        ListNode list1Node2 = new ListNode(4);
        ListNode list1Node3 = new ListNode(3);
        list1Node1.next = list1Node2;
        list1Node2.next = list1Node3;

        // 链表 2
        ListNode list2Node1 = new ListNode(5);
        ListNode list2Node2 = new ListNode(6);
        ListNode list2Node3 = new ListNode(4);
        list2Node1.next = list2Node2;
        list2Node2.next = list2Node3;

        ListNode resListNode = addTwoNumbers(list1Node1, list2Node1);

        listNodePrint(resListNode);

    }

    /**
     * 注意逆序
     * 注意引用类型
     *
     * @param listNode1 链表 1
     * @param listNode2 链表 2
     * @return listNode
     */
    public static ListNode addTwoNumbers(ListNode listNode1, ListNode listNode2) {

        // 这里一方面是为了提高可读性,一方面是为了保留原来的 listNode1(引用类型,修改 p 也会修改 l1 的值)
        // 保留 listNode1 是为了最后的返回,因为 p 会走到 listNode1 最后的结点,要返回的是头结点
        ListNode p = listNode1;
        ListNode q = listNode2;

        // addNum 表示十位的数,即表示进位
        int addNum = 0;

        // 直到 q.next == null
        while (q != null) {

            // 因为链表长度不一定相等,如果有一个到头,另一个不到头,则将到头链表的空的位置补 0
            if (p.next == null && q.next != null) {
                p.next = new ListNode(0);
            }
            if (p.next != null && q.next == null) {
                q.next = new ListNode(0);
            }

            // 真正的和
            int sumAll = addNum + p.val + q.val;
            p.val = sumAll % 10;

            // 下一次进位
            addNum = sumAll / 10;

            // 如果两个链表都到头了,且还有未处理的进位,则将进位挂在后面(即最后一个,即最高位)
            if (p.next == null && q.next == null && addNum != 0) {
                p.next = new ListNode(addNum);
            }

            p = p.next;
            q = q.next;
        }
        return listNode1;
    }

    /**
     * 递归打印
     *
     * @param listNode 需打印的链表
     */
    public static void listNodePrint(ListNode listNode) {

        if (listNode == null) {
            return;
        }

        if (listNode.next == null) {
            System.out.println(listNode.val);
            return;
        }

        System.out.println(listNode.val);
        listNodePrint(listNode.next);
    }

}

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

相关文章:

  • LeetCode03 - 无重复字符的最长子串(Java 实现)
  • Idea 获取 git 仓库时更新类型update type 的选择
  • Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP
  • 8080 端口被占用的解决方法 netstat -ano;taskkill (命令行)
  • 手写 Spring MVC
  • Oracle 在 Drop 表时的 Cascade Constraints
  • Oracle:ORA-01219:database not open:queries allowed on fixed tables/views only
  • MyBatis: Invalid bound statement (not found) 错误的可能原因
  • Git 删除已经 Push 的远程文件夹或文件的命令方法
  • 写给自己 - 开发路上
  • ubuntu 18 自带截图工具 - 快捷键
  • svn 必须会敲的常用命令
  • ubuntu 18 解锁文件目录(谨慎操作)
  • ubuntu 18 安装 navicat Premium 中文乱码(很彻底)
  • 在 ubuntu 18 中为 navicat 创建快捷方式
  • [case10]使用RSQL实现端到端的动态查询
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Android单元测试 - 几个重要问题
  • co.js - 让异步代码同步化
  • C语言笔记(第一章:C语言编程)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaScript类型识别
  • LeetCode18.四数之和 JavaScript
  • mongodb--安装和初步使用教程
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node 版本过低
  • Odoo domain写法及运用
  • React Native移动开发实战-3-实现页面间的数据传递
  • Transformer-XL: Unleashing the Potential of Attention Models
  • V4L2视频输入框架概述
  • 闭包,sync使用细节
  • 二维平面内的碰撞检测【一】
  • 翻译--Thinking in React
  • 基于游标的分页接口实现
  • ------- 计算机网络基础
  • 实战|智能家居行业移动应用性能分析
  • 数据可视化之 Sankey 桑基图的实现
  •  一套莫尔斯电报听写、翻译系统
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #1014 : Trie树
  • #单片机(TB6600驱动42步进电机)
  • $GOPATH/go.mod exists but should not goland
  • (C语言)字符分类函数
  • (java)关于Thread的挂起和恢复
  • (第61天)多租户架构(CDB/PDB)
  • (第二周)效能测试
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Linux下编译安装log4cxx
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法