You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 8 -> 0 -> 7
因为是从后往前加,所以要先预先知道两个链表的长度,得到offset再分治求解,即得到当前的,得到下一个的,如果下一个的值大于9,对下一个和当前节点的值都进行更新。在取下一个值的时候,需要判断下一个节点是非空的。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(1); int size1 = get_size(l1); int size2 = get_size(l2); dummy->next = size1 > size2 ? add(l1, l2, size1 - size2) : add(l2, l1, size2 - size1); if (dummy->next->val >= 10) { dummy->next->val = dummy->next->val % 10; return dummy; } return dummy->next; } private: int get_size(ListNode* l1) { int size = 0; while (l1 != NULL) { size++; l1 = l1->next; } return size; } ListNode* add(ListNode* l1, ListNode* l2, int offset) { if (l1 == NULL) { return NULL; } ListNode* result = offset == 0 ? new ListNode(l1->val + l2->val) : new ListNode(l1->val); ListNode* post = offset == 0 ? add(l1->next, l2->next, 0) : add(l1->next, l2, offset - 1); if (post != NULL && post->val >= 10) { post->val = post->val % 10; result->val = result->val + 1; } result->next = post; return result; } };