You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order 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.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8Explanation: 342 + 465 = 807.
最开始自己的解法是这样的,注意else if的时候要限制另一个不为空
/** * 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(0); add(dummy, l1, l2, 0); return dummy->next; } private: void add(ListNode* node, ListNode* l1, ListNode* l2, int flag) { if (l1 == NULL && l2 == NULL && flag == 0) { node->next = NULL; return; } else if (l1 != NULL && l2 != NULL) { node->next = new ListNode(l1->val + l2->val + flag); flag = node->next->val >= 10 ? 1 : 0; node->next->val = node->next->val % 10; add(node->next, l1->next, l2->next, flag); } else if (l1 == NULL && l2!= NULL) { node->next = new ListNode(l2->val + flag); flag = node->next->val >= 10 ? 1 : 0; node->next->val = node->next->val % 10; add(node->next, NULL, l2->next, flag); } else if (l2 == NULL && l1 != NULL) { node->next = new ListNode(l1->val + flag); flag = node->next->val >= 10 ? 1 : 0; node->next->val = node->next->val % 10; add(node->next, l1->next, NULL, flag); } else if (flag == 1) { node->next = new ListNode(1); return; } } };
另一种方法即为找到当前,同时用递归得到下一个,并将当前和下一个连接起来:
/** * 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(0); dummy->next = add(l1, l2, 0); return dummy->next; } private: ListNode* add(ListNode* l1, ListNode* l2, int flag) { ListNode* result = NULL; ListNode* post = NULL; if (l1 == NULL && l2 == NULL && flag == 0) { return NULL; } else if (l1 != NULL && l2 != NULL) { int tmp = l1->val + l2->val + flag; flag = tmp >= 10 ? 1 : 0; result = new ListNode(tmp % 10); post = add(l1->next, l2->next, flag); } else if (l1 == NULL && l2!= NULL) { int tmp = l2->val + flag; flag = tmp >= 10 ? 1 : 0; result = new ListNode(tmp % 10); post = add(NULL, l2->next, flag); } else if (l2 == NULL && l1 != NULL) { int tmp = l1->val + flag; flag = tmp >= 10 ? 1 : 0; result = new ListNode(tmp % 10); post = add(l1->next, NULL, flag); } else if (flag == 1) { return new ListNode(1); } result->next = post; return result; } };