LeetCode:两数相加II

转自
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
**分析:**两个数字相加,数字的最高位位于链表的开始位置。由于不能反转链表,链表中数位的顺序与做加法的顺序是相反的。为了逆序处理所有数位,可以使用栈:把所有数字压入栈中,再依次取出相加。计算过程中需要注意进位的情况。
LeetCode:两数相加II_第1张图片

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        stack<int> s1, s2; %创建两个栈
        while (l1) {
            s1.push(l1 -> val);
            l1 = l1 -> next;
        } %l1非空则压栈
        while (l2) {
            s2.push(l2 -> val);
            l2 = l2 -> next;
        } %l2非空则压栈
        int carry = 0;%进位变量
        ListNode* ans = nullptr; %创建链表,保存结果
        while (!s1.empty() or !s2.empty() or carry != 0) {
            int a = s1.empty() ? 0 : s1.top();
            int b = s2.empty() ? 0 : s2.top();%s1, s2栈非空取栈顶元素,空则取0
            if (!s1.empty()) s1.pop();
            if (!s2.empty()) s2.pop();%栈非空则pop出栈顶元素
            int cur = a + b + carry;
            carry = cur / 10;
            cur %= 10;
            auto curnode = new ListNode(cur);
            curnode -> next = ans;
            ans = curnode;
        }
        return ans;
    }
};

python 版

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        s1, s2 = [], []
        while l1:
            s1.append(l1.val)
            l1 = l1.next
        while l2:
            s2.append(l2.val)
            l2 = l2.next
        ans = None
        carry = 0
        while s1 or s2 or carry != 0:
            a = 0 if not s1 else s1.pop()
            b = 0 if not s2 else s2.pop()
            cur = a + b + carry
            carry = cur // 10
            cur %= 10
            curnode = ListNode(cur)
            curnode.next = ans
            ans = curnode
        return ans

你可能感兴趣的:(LeetCode)