zoukankan      html  css  js  c++  java
  • 445. Add Two Numbers II

    问题描述:

    You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

    You may assume the two numbers do not contain any leading zero, except the number 0 itself.

    Follow up:
    What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

    Example:

    Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 8 -> 0 -> 7

    解题思路:

    由于是按照正常顺序排序,即最高位在最前面。

    但是加法要从最低位开始。

    所以我们可以用栈存储每一个节点。

    将栈顶元素相加。

    直至两栈为空。

    空间复杂度O(m+n)

    时间复杂度O(max(m+n))

    代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            if(!l1) return l2;
            if(!l2) return l1;
            
            stack<ListNode*> s1, s2;
            ListNode* cur1 = l1;
            ListNode* cur2 = l2;
            
            while(cur1){
                s1.push(cur1);
                cur1 = cur1->next;
            }
            while(cur2){
                s2.push(cur2);
                cur2 = cur2->next;
            }
            
            ListNode* last = NULL;
            int carry = 0;
            while(!s1.empty() && !s2.empty()){
                int val = s1.top()->val + s2.top()->val + carry;
                s1.pop();
                s2.pop();
                carry = val / 10;
                val %= 10;
                ListNode* cur = new ListNode(val);
                cur->next = last;
                last = cur;
            }
            
            while(!s1.empty()){
                int val = s1.top()->val + carry;
                carry = val / 10;
                val %= 10;
                s1.pop();
                ListNode* cur = new ListNode(val);
                cur->next = last;
                last = cur;
            }
            
            while(!s2.empty()){
                int val = s2.top()->val + carry;
                carry = val / 10;
                val %= 10;
                s2.pop();
                ListNode* cur = new ListNode(val);
                cur->next = last;
                last = cur;
            }
            
            if(carry != 0){
                ListNode* cur = new ListNode(carry);
                cur->next = last;
                last = cur;
            }
            
            return last;        
            
        }
    };

    换一种写法:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            if(!l1) return l2;
            if(!l2) return l1;
            
            stack<ListNode*> s1, s2;
            ListNode* cur1 = l1;
            ListNode* cur2 = l2;
            
            while(cur1){
                s1.push(cur1);
                cur1 = cur1->next;
            }
            while(cur2){
                s2.push(cur2);
                cur2 = cur2->next;
            }
            
            ListNode* last = NULL;
            int carry = 0;
            while(!s1.empty() || !s2.empty() || carry != 0){
                int val1 = 0, val2 = 0;
                if(!s1.empty()){
                    val1 = s1.top()->val;
                    s1.pop();
                }
                if(!s2.empty()){
                    val2 = s2.top()->val;
                    s2.pop();
                }
                int val = val1 + val2 + carry;
                carry = val / 10;
                val %= 10;
                ListNode* cur = new ListNode(val);
                cur->next = last;
                last = cur;
            }
            
            return last;        
            
        }
    };
  • 相关阅读:
    [商业][思想]《免费 商业的未来 Free The Future of a Radical Price》 克里斯·安德森(美)
    《幸福就在你身边》第六课、心动就要行动【哈佛大学"幸福课"精华】
    人性歪曲的心理调适 一【犹豫心理、怯场心理、依赖心理、盲从心理、攀比心理】
    《幸福就在你身边》第九课、确信自己有好命【哈佛大学"幸福课"精华】
    ORACLE FLASHBACK恢复删除的所有表
    抽象类和接口的例子
    抽象类专题二:抽象类的用途
    Entity Framework中的批量提交与事务处理[转]
    如何处理JSON中的特殊字符
    C# params参数的应用
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9458424.html
Copyright © 2011-2022 走看看