JZII 025. 链表中的两数相加

77 阅读1分钟

leetcode.cn/problems/lM…

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

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

 

示例1:

输入:l1 = [7,2,4,3], l2 = [5,6,4] 输出:[7,8,0,7] 示例2:

输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7] 示例3:

输入:l1 = [0], l2 = [0] 输出:[0]  

提示:

链表的长度范围为 [1, 100] 0 <= node.val <= 9 输入数据保证链表代表的数字无前导 0  

进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。

方法一:栈

思路与算法

本题的主要难点在于链表中数位的顺序与我们做加法的顺序是相反的,为了逆序处理所有数位,我们可以使用栈:把所有数字压入栈中,再依次取出相加。计算过程中需要注意进位的情况。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();

        while (l1 != null) {
            stack1.push(l1.val);
            l1 = l1.next;
        }

        while (l2 != null) {
            stack2.push(l2.val);
            l2 = l2.next;
        }

        ListNode after = null;
        ListNode cur = null;
        int carry = 0;
        while (!stack1.isEmpty() || !stack2.isEmpty() || carry != 0) {
            int a = 0, b = 0;
            if (!stack1.isEmpty()) {
                a = stack1.pop();
            }
            if (!stack2.isEmpty()) {
                b = stack2.pop();
            }
            int sum = a + b + carry;
            cur = new ListNode(sum % 10);
            cur.next = after;
            after = cur;
            carry = sum / 10;
        }
        return cur;
    }
}