/** * 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; } };
链表相加数据本身就是低位到高位,这样就可以直接遍历链表一位一位进行加法运算
本题给的数据顺序由高位到低位,但是加法的规则又要求从最低位开始相加,所以对两个链表进行反转链表操作即可