/**
* 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;
}
};
模拟加法时发现是从链表尾部开始加,因此考虑将两个链表逆序,然后模拟竖式加法过程,模拟完之后再将结果链表逆序。易错点:考虑最后一个进位

京公网安备 11010502036488号