2023-07-03 445. 两数相加 II

166 阅读1分钟

leetcode.cn/problems/ad…

两个链表需要根据末尾对齐相加,为了实现这个目的,我们可以使用栈来存储两个链表的节点,任何一个时刻,栈顶的元素肯定是数字中同一个位置的(个十百千万...)。计算的时候同时弹出栈顶的元素,执行竖式加法的操作。需要注意加法中的进位,以及加法最终结果第一位还有进位的场景。

/**
 * 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) {
        Deque<ListNode> stack1 = new ArrayDeque<>();
        Deque<ListNode> stack2 = new ArrayDeque<>();
        while (l1 != null || l2 != null) {
            if (l1 != null) {
                stack1.addLast(l1);
                l1 = l1.next;
            }
            if (l2 != null) {
                stack2.addLast(l2);
                l2 = l2.next;
            }
        }
        ListNode dummyHead = new ListNode();
        int carry = 0;
        while (!stack1.isEmpty() && !stack2.isEmpty()) {
            ListNode node1 = stack1.removeLast();
            ListNode node2 = stack2.removeLast();
            int sum = node1.val + node2.val + carry;
            carry = sum / 10;

            ListNode newNode = new ListNode(sum % 10);
            newNode.next = dummyHead.next;
            dummyHead.next = newNode;
        }
        while (!stack1.isEmpty()) {
            ListNode node = stack1.removeLast();
            int sum = node.val + carry;
            carry = sum / 10;

            ListNode newNode = new ListNode(sum % 10);
            newNode.next = dummyHead.next;
            dummyHead.next = newNode;
        }
        while (!stack2.isEmpty()) {
            ListNode node = stack2.removeLast();
            int sum = node.val + carry;
            carry = sum / 10;
            
            ListNode newNode = new ListNode(sum % 10);
            newNode.next = dummyHead.next;
            dummyHead.next = newNode;
        }
        if (carry == 1) {
            ListNode newNode = new ListNode(1);
            newNode.next = dummyHead.next;
            dummyHead.next = newNode;
        }
        return dummyHead.next;
    }
}