• LeetCode题解【题2】:两数相加


    原题链接:https://leetcode-cn.com/problems/add-two-numbers/

    查看请另起链接打开。

    解题思路
    执行用时 :2 ms, 在所有 Java 提交中击败了99.97%的用户。内存消耗 :40.6 MB, 在所有 Java 提交中击败了91.21%的用户。

    此题的关键是自己实现一个两数的加法。
    之前以为可以通过数学运算实现,发现无论是int还是long都会存在溢出,无法完成所有测试案例。
    1、加法思路很简单,像解小学数学加法一样,个位和个位相加,十位和十位相加,类推。使用一个进位符c,若每位的两个数相加的和大于9,则,c=1;在当次相加完后,c归0;

    2、取数的时候要保证两个ListNode的位都对应上,则取数都在同一个循环中去取,如果当前节点非空则取出值且当前节点指向下一个节点,若当前节点为空则取值为0。循环的跳出点是当两个当前节点的取值都为空时。

    3、存数的时候也需要指定两个节点,一个是需要返回的节点ListNode r,它指向第一个节点;还有一个是存储当前计算的值的节点。初始化条件当r为null,则将第一个数存入r,再令current = r,以后每次存值的时候都是current移向下一个节点。

    最后如果输入的两个ListNode都遍历完了,但是进位符c还为1,说明需要再进一位,则在返回的r后再添加1(相当于最高位是1,也只会是1)。

    代码

    /**
     * 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 n1,n2,n3;
                // 初始化进位符为0
                int c = 0;
                ListNode r = null;
                ListNode current = null;
                while(l1!= null || l2!= null){
                    // 取数操作
                    if (l1 == null){
                        n1 = 0;
                    }else {
                        n1 = l1.val;
                        l1 = l1.next;
                    }
                    if (l2 == null){
                        n2 = 0;
                    }else {
                        n2 = l2.val;
                        l2 = l2.next;
                    }
                    // 当前位两个数相加的和,带上进位符c
                    n3 = n1+n2+c;
                    // 相加完成,进位符归0
                    c = 0;
                    // 若每位的两个数相加的和大于9,则,c=1
                    if (n3 > 9){
                        n3 %= 10;
                        c = 1;
                    }
                    // 存数操作
                    if (r == null) {
                        r = new ListNode(n3);
                        current = r;
                    } else {
                        current.next = new ListNode(n3);
                        current = current.next;
                    }
                }
                // 最后如果输入的两个ListNode都遍历完了,但是进位符c还为1,说明需要再进一位,则在返回的r后再添加1
                if (c == 1){
                    current.next = new ListNode(1);
                }
                return r;
            }
        }

    作者:xu-man-man (本人)
    链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-liang-ge-lian-biao-shi-xian-ji/
    来源:力扣(LeetCode)

  • 相关阅读:
    Linux 技巧
    设计模式大集合
    [Java] Design Pattern:Code Shape
    [Java] 设计模式: Code Shape
    BookNote: Refactoring
    读书笔记: 博弈论导论
    读书笔记: 博弈论导论
    读书笔记: 博弈论导论
    读书笔记: 博弈论导论
    读书笔记: 博弈论导论
  • 原文地址:https://www.cnblogs.com/schoolbag/p/12334685.html
Copyright © 2020-2023  润新知