/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    // 反转链表函数
    ListNode* rever(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        ListNode* nex = nullptr;
        while (cur) {
            nex = cur->next;  // 保存下一个节点
            cur->next = pre;  // 反转当前节点指针
            pre = cur;        // 更新前驱节点
            cur = nex;        // 移动到下一个节点
        }
        return pre;  // 返回新头节点(原尾节点)
    }

    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 反转两个链表,使低位在前
        ListNode* p1 = rever(head1);
        ListNode* p2 = rever(head2);
        
        // 创建虚拟头节点,简化链表操作
        ListNode* dummy = new ListNode(0);
        ListNode* cur = dummy;  // 当前节点指针
        int carry = 0;          // 进位标志(初始为0)

        // 遍历两个链表,处理所有节点和进位
        while (p1 != nullptr || p2 != nullptr || carry != 0) {
            // 计算当前位总和(节点值+进位)
            int sumVal = carry;
            if (p1 != nullptr) {
                sumVal += p1->val;
                p1 = p1->next;  // 移动到下一位
            }
            if (p2 != nullptr) {
                sumVal += p2->val;
                p2 = p2->next;  // 移动到下一位
            }

            // 计算当前位值和新进位
            carry = sumVal / 10;        // 进位(0或1)
            int currentVal = sumVal % 10;  // 当前位值(个位)

            // 创建新节点并拼接
            cur->next = new ListNode(currentVal);
            cur = cur->next;  // 移动到新节点
        }

        // 反转结果链表,恢复高位在前的顺序
        ListNode* result = rever(dummy->next);
        return result;
    }
};