/**
 * 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 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;
        // ListNode* ans = cur;
        // cout << ans->val << endl;
        // // 最终cur变为nullptr
        // while(cur)
        // {
        //     ListNode* cur_next = cur->next;
        //     cur->next = next;
        //     next = cur;
        //     cur = cur_next;
        // }

        // return ans;
    }
};