LintCode 221. Add Two Numbers II

2017-10-22  本文已影响0人  Andiedie

原题

LintCode 221. Add Two Numbers II

Description

You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in forward order, such that the 1's digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.

Example

Given 6->1->7 + 2->9->5. That is, 617 + 295.

Return 9->1->2. That is, 912.

解题

题意是给定两个用链表表示的数,链表中的每个节点是数字的一位,第一个节点是数的最高位。求两个数的和。

问题主要在于,要从最后一位开始加法和进位的话,无法获取前面数位的引用。

所以可以利用栈的思想对链表进行“反向”,然后正常计算即可。

代码

class Solution {
public:
    /*
    * @param l1: The first list.
    * @param l2: The second list.
    * @return: the sum list of l1 and l2.
    */
    ListNode * addLists2(ListNode * l1, ListNode * l2) {
        // write your code here
        ListNode *ans = nullptr;
        stack<int> stack1, stack2;
        while (l1 != nullptr) {
            stack1.push(l1->val);
            l1 = l1->next;
        }
        while (l2 != nullptr) {
            stack2.push(l2->val);
            l2 = l2->next;
        }
        stack<int> &s1 = stack1.size() >= stack2.size() ? stack1 : stack2;
        stack<int> &s2 = stack1.size() >= stack2.size() ? stack2 : stack1;
        while (!s1.empty()) {
            int a, b;
            a = s1.top();
            s1.pop();
            if (s2.size()) {
                b = s2.top();
                s2.pop();
            } else {
                b = 0;
            }
            int sum = a + b;
            int carry = sum / 10;
            ListNode *temp = ans;
            ans = new ListNode(sum % 10);
            ans->next = temp;
            if (carry > 0) {
                if (s1.empty()) {
                    ListNode *temp = ans;
                    ans = new ListNode(carry);
                    ans->next = temp;
                } else {
                    s1.top() += carry;
                }
            }
        }
        return ans;
    }
};
上一篇下一篇

猜你喜欢

热点阅读