/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <clocale>
#include <ostream>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        // 反转链表.
        ListNode* newHead1 = new ListNode(0);
        ListNode* newHead2 = new ListNode(0);
        ListNode* newHead = new ListNode(0);

        ListNode* p1 = head1;
        ListNode* p2 = head2;

        while (p1) {
            ListNode* t = p1->next;
            p1->next = newHead1->next;
            newHead1->next = p1;
            p1 = t;
        }
        while (p2) {
            ListNode* t = p2->next;
            p2->next = newHead2->next;
            newHead2->next = p2;
            p2 = t;
        }

        // p1 = newHead1->next, p2 = newHead2->next;
        // while(p1) {
        //     cout << p1->val << " ";
        //     p1 = p1->next;
        // }
        // cout << endl;
        // while(p2) {
        //     cout << p2->val << " ";
        //     p2 = p2->next;
        // }
        // cout << endl;

        int carry = 0;

        p1 = newHead1->next, p2 = newHead2->next;
        cout << p1->val << " " << p2->val << endl;
        while (p1 && p2) {
            int sum = (p1->val + p2->val + carry) % 10;
            carry = (p1->val + p2->val + carry) / 10;

            p1 = p1->next;
            p2 = p2->next;
            
            // cout << "sum = " << sum << " " << "carry = " << carry << endl;

            ListNode* node = new ListNode(sum);
            node->next = newHead->next;
            newHead->next = node;
        }

        while (p1) {
            int sum = (p1->val + carry) % 10;
            carry = (p1->val + carry) / 10;

            p1 = p1->next;

            ListNode* node = new ListNode(sum);
            node->next = newHead->next;
            newHead->next = node;
        }
        while (p2) {
            int sum = (p2->val + carry) % 10;
            carry = (p2->val + carry) / 10;

            p2 = p2->next;

            ListNode* node = new ListNode(sum);
            node->next = newHead->next;
            newHead->next = node;
        }

        cout << carry << endl;
        if (carry > 0) {
            ListNode* node = new ListNode(carry);
            node->next = newHead->next;
            newHead->next = node;
        }

        return newHead->next;
    }
};

链表相加数据本身就是低位到高位,这样就可以直接遍历链表一位一位进行加法运算

本题给的数据顺序由高位到低位,但是加法的规则又要求从最低位开始相加,所以对两个链表进行反转链表操作即可