zoukankan      html  css  js  c++  java
  • LeetCode02

    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;
        }
    }
    
  • 相关阅读:
    Thread.Join
    WPF几个基础概念的浅显理解
    Vue v-bind指令
    Vue设置路由跳转的两种方法: <router-link :to="..."> 和router.push(...)
    前端上传视频、图片、文件等大文件 组件Plupload使用指南
    vue如何获取并操作DOM元素
    css中border-sizing属性详解和应用
    vue使用axios发送post请求时的坑及解决原理
    vue中的js引入图片,使用require相关问题
    vue 动态添加body背景图片
  • 原文地址:https://www.cnblogs.com/xpwi/p/11185332.html
Copyright © 2011-2022 走看看