/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { ListNode *reverseList(ListNode *head) { ListNode *p = head, *q, *last = nullptr; while(p) { q = p->next; p->next = last; last = p; p = q; } return last; } public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ ListNode* addInList(ListNode* head1, ListNode* head2) { auto reverse_head1 = reverseList(head1); auto reverse_head2 = reverseList(head2); ListNode *p1 = reverse_head1, *p2 = reverse_head2; int carry = 0, add1, add2, sum, real_sum; ListNode *tail; ListNode *reverse_sum_head = nullptr; while(p1 || p2 || carry) { add1 = p1 ? p1->val : 0; add2 = p2 ? p2->val : 0; real_sum = add1 + add2 + carry; sum = real_sum % 10; carry = real_sum / 10; if(!reverse_sum_head) { reverse_sum_head = new ListNode(sum); tail = reverse_sum_head; } else { tail->next = new ListNode(sum); tail = tail->next; } if(p1) p1 = p1->next; if(p2) p2 = p2->next; } auto sum_head = reverseList(reverse_sum_head); return sum_head; } };
模拟加法时发现是从链表尾部开始加,因此考虑将两个链表逆序,然后模拟竖式加法过程,模拟完之后再将结果链表逆序。易错点:考虑最后一个进位