/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        // 方法一:数组
        vector<int> v_1,v_2;
        while(head1)
        {
            v_1.emplace_back(head1->val);
            head1 = head1->next;
        }

        while(head2)
        {
            v_2.emplace_back(head2->val);
            head2 = head2->next;
        }
        // 反转数组
        reverse(v_1.begin(),v_1.end());
        reverse(v_2.begin(),v_2.end());
        int len_1 = v_1.size();
        int len_2 = v_2.size();
        int flag = 0;
        vector<int> v;
        for(int i=0; i<max(len_1,len_2); ++i)
        {
            int sum = 0;
            if(i<len_1 && i<len_2)
            {
                sum = (v_1[i]+v_2[i]+flag)%10;
                flag = (v_1[i]+v_2[i]+flag)/10;
            }
            else if(i<len_1)
            {
                sum = (v_1[i]+flag)%10;
                flag = (v_1[i]+flag)/10;
            }
            else
            {
                sum = (v_2[i]+flag)%10;
                flag = (v_2[i]+flag)/10;
            }
            v.emplace_back(sum);
            
        }

        if(flag)
        {
            v.emplace_back(flag);
        }
        // 反转数组
        reverse(v.begin(),v.end());
        // 创建链表
        ListNode* ans = new ListNode(-1);
        ListNode* resut = ans;
        for(int i=0; i<v.size(); ++i)
        {
            ListNode* temp = new ListNode(v[i]);
            ans->next = temp;
            ans = ans->next;
        }

        return resut->next;

        // 方法二:val转为int,相加后创建链表,然后反转链表,但是反转链表老是失败,指针指向何处?最后返回才是重点啊!!!
        // 会超出int的范围
    //     int head_1 = 0, head_2 = 0;
        
    //     while(head1)
    //     {
    //         head_1 = head_1*10+(head1->val);
    //         head1 = head1->next;
    //     }

    //     while(head2)
    //     {
    //         head_2 = head_2*10+(head2->val);
    //         head2 = head2->next;
    //     }

    //     int sum = head_1+head_2;

    //     // 构建链表
    //     ListNode* list_1 = new ListNode(-1);
    //     ListNode* list_2 = list_1;
    //     // list_2 = {-1,0,0,0,1};
    //     while(sum!=0)
    //     {
    //         int temp = sum%10;
    //         ListNode* next = new ListNode(temp);
    //         list_1->next = next;
    //         // 链表节点移动
    //         list_1 = list_1->next;
    //         sum /= 10;
    //     }
    //     // cout << list_2->next->next->next->next->val << endl;
    //     // 反转链表
    //     ListNode* next = nullptr;
    //     ListNode* cur = list_2->next;
    //     // 最终cur变为nullptr
    //     while(cur)
    //     {
    //         ListNode* cur_next = cur->next;
    //         cur->next = next;
    //         next = cur;
    //         cur = cur_next;
    //     }
    //     // 返回这里才是重点啊!!!
    //     return next;
    }
};