LeetCode#2.Add Two Numbers
题目
You are given two linked lists representing two non-negative numbers. 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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 –> 8
思想
很简单的一道题,对于两个链表一次将每一项相加。考虑以下问题
1.进位,取出十位加入下一个结果
2.最后还剩下进位,新建一个节点
3.有一个链表为空
代码
/** * 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) { vector<int> resVec; int result=0; int carry=0; while (!(l1 == NULL&&l2 == NULL)) { if (l1 == NULL) { result = l2->val+carry; carry = result / 10; result %= 10; resVec.push_back(result); l2 = l2->next; continue; } if (l2 == NULL) { result = l1->val + carry; carry = result / 10; result %= 10; resVec.push_back(result); l1 = l1->next; continue; } if (l1 != NULL&&l2 != NULL) { result = l1->val + l2->val+carry; carry = result / 10; result %= 10; resVec.push_back(result); l1 = l1->next; l2 = l2->next; } } if (carry != 0) { resVec.push_back(carry); } ListNode* r = new ListNode(0); ListNode *k = r; for (int i = 0; i < resVec.size(); i++) { r->next = new ListNode(resVec[i]); r = r->next; } k = k->next; return k; } };
注:为了方便生成结果链表,我这里把结果存在vector里,所以一共扫描两次,O(2n)。
在讨论区发现的非常简洁优雅的代码
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* head = new ListNode(0); ListNode* cur = head; int plus = 0; while (l1 || l2) { int num = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + plus; if (num >= 10) { num -= 10; plus = 1; } else plus = 0; cur->next = new ListNode(num); cur = cur->next; if (l1) l1 = l1->next; if (l2) l2 = l2->next; } if (plus) cur->next = new ListNode(1); return head->next; } };