static const auto io_sync_off=[]() { //turn off sync std::ios::sync_with_stdio(false); //untie in/out stream; std::cin.tie(nullptr); return nullptr; }(); class Solution { public: ListNode* addInList(ListNode* head1, ListNode* head2) { int a = 0, b = 0; //记录链表长度 head1 = reverse(head1, a); //翻转链表1并返回头 head2 = reverse(head2, b); //翻转链表2并返回头 if(a < b) swap(head1, head2); //让较长的链表作为链表1 ListNode* record = head1; //记录链表1的头,用于后续再次翻转 bool carry = 0; //记录进位信息 while(head2) { //因为链表2短,因此只需先遍历链表2 int temp = head1->val + head2->val + carry; //各位及进位相加 carry = 0; //进位符清零 if(temp >= 10) { //若进位 carry = 1; //设置进位符 temp %= 10; //取余 } head1->val = temp; //直接在链表1上修改值 head2 = head2->next; //链表2向前 if(head2) //判断一下链表2是否遍历完 head1 = head1->next; //如果没遍历完,则链表1肯定也没遍历完,这样不至于让head1成为nullptr方便后续操作 } while(carry) { //接着在链表1上处理进位 carry = 0; //进位符清零 if(head1->next) { //先判断有没有下一位 head1 = head1->next; //有的话移到下一位 if(head1->val == 9) { //直接判断是不是9 carry = 1; //是9则进位 head1->val = 0; //并且设置为0 } else head1->val ++; //否则自身加1 } else head1->next = new ListNode(1); //若无下一位创造值为1的新ListNode } return reverse(record, a); //返回翻转链表1的头 } ListNode* reverse(ListNode* ln, int &length) { //翻转链表懂的都懂,引用length记录长度 ListNode* pre = nullptr; ListNode* cur = ln; ListNode* next = nullptr; while(cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; length++; } return pre; } };