美文网首页
LeetCode2.两数相加

LeetCode2.两数相加

作者: 鬼鬼812 | 来源:发表于2019-06-09 16:53 被阅读0次

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    思路:我的方法额外开辟了内存空间,定义了一个数组,将两个链表中的数先相加然后存放到数组中,然后从头遍历一边数组,把需要进位的位置进行进位计算,然后最后在转到一个链表中去
    注意:1:一开始存入数组时注意哪个链表长,哪个链表短
    2:最后数组转链表的时候,很可能在最后会有进位,超出了数组的下标范围,要注意考虑

    /**
     * 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) {
            vector<int> v;
            while(l1 && l2){
                v.push_back(l1->val + l2->val);
                l1 = l1 -> next;
                l2 = l2 -> next;
            }
            while(l1){
                v.push_back(l1 -> val);
                l1 = l1 -> next;
            }
            while(l2){
                v.push_back(l2 -> val);
                l2 = l2 -> next;
            }
            for(int i = 0 ; i < v.size()-1 ; i ++){
                if(v[i] != 0){
                    v[i+1] += v[i]/10;
                    v[i] %= 10;
                }
            }
            if(v[v.size()-1] >= 10){
                v.push_back(v[v.size()-1]/10);
                v[v.size() - 2] %= 10;
            }
            ListNode* head = new ListNode(0);
            ListNode* p = head;
            p -> val = v[0];
            for(int i = 1 ; i < v.size() ; i++){
                ListNode* node = new ListNode(v[i]);
                p -> next = node;
                p = p -> next;
            }
            return head;
        }
    };
    

    相关文章

      网友评论

          本文标题:LeetCode2.两数相加

          本文链接:https://www.haomeiwen.com/subject/fbenxctx.html