【Leetcode】445. 两数相加 II

179 阅读1分钟

题目描述

在这里插入图片描述

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

题解

坑:这题只能逐位计算,不能把链表整个直接转为一个整体 int 来计算,因为给的测试用例会溢出,求和会导致溢出。

逐位计算的话,我们希望的是从低位到高位遍历,求和之后的进位可以记录下来,用于下一位遍历的求和。但是题目链表给的是从高位到低位的顺序,所以我们必须先想办法,让我们能从低位到高位遍历。

我的做法是遍历一遍两个链表,然后把数字存在List中,这样我们就可以从任意方向遍历每一位了(也就可以从低位到高位遍历了)。

执行用时:2 ms, 在所有 Java 提交中击败了98.96%的用户

内存消耗:38.7 MB, 在所有 Java 提交中击败了59.70%的用户

通过测试用例:1563 / 1563

import java.util.ArrayList;
import java.util.List;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        // 1.取出两个链表的数字存为序列
        // l1 = [7,2,4,3], l2 = [5,6,4]
        // list1 = [7,2,4,3], list2 = [5,6,4]
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();
        while (l1 != null) {
            list1.add(l1.val);
            l1 = l1.next;
        }
        while (l2 != null) {
            list2.add(l2.val);
            l2 = l2.next;
        }

        // 2.准备遍历
        ListNode res = new ListNode(-1);
        int index1 = list1.size() - 1;
        int index2 = list2.size() - 1;
        int carry = 0;  // 进位记录

        // 3.两链表数字相加,记录进位carry,相加结果存储到链表
        while (index1 >= 0 || index2 >= 0 || carry != 0) {
            int tempSum = 0;
            int val1 = 0;
            int val2 = 0;
            if (index1 >= 0) {
                val1 = list1.get(index1);
                index1--;
            }
            if (index2 >= 0) {
                val2 = list2.get(index2);
                index2--;
            }
            tempSum = val1 + val2 + carry;
            int low = tempSum % 10;
            int high = tempSum / 10;
            carry = high;

            ListNode temp = new ListNode(low);
            temp.next = res.next;
            res.next = temp;
        }

        return res.next;
    }
}