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)

posted @ 2020-02-20 10:40  知识小书包  阅读(288)  评论(0编辑  收藏  举报