LeetCode2.两数相加

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

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

您可以假设除了数字 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;
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务