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
题解:
Solution 1
加和是从尾部开始的,而链表又只能从前开始遍历,那么这种单向的遍历顺序就及其适合用queue或者stack来辅助。显然此题用到的是stack。
1 class Solution { 2 public: 3 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 4 stack<int> s1, s2; 5 while (l1) { 6 s1.push(l1->val); 7 l1 = l1->next; 8 } 9 while (l2) { 10 s2.push(l2->val); 11 l2 = l2->next; 12 } 13 int sum = 0; 14 ListNode* pre = nullptr; 15 while (!s1.empty() || !s2.empty() || sum) { 16 if (!s1.empty()) { 17 sum += s1.top(); 18 s1.pop(); 19 } 20 if (!s2.empty()) { 21 sum += s2.top(); 22 s2.pop(); 23 } 24 ListNode *node = new ListNode(sum % 10); 25 node->next = pre; 26 pre = node; 27 sum /= 10; 28 } 29 return pre; 30 } 31 };
Solution 2
设计的很巧妙,无需开辟存储空间。转自 Grandyang。用right记录目前最右第一个值不是9的元素。用cur遍历链表。如果cur遍历时有进位, 那么right自增1,且right到cur(左开右闭)之间的由于都是9(因为right指向的是目前最右第一个值不是9的元素),所以此区间内的元素值全部置0。
1 class Solution { 2 public: 3 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 4 int len1 = getLength(l1), len2 = getLength(l2); 5 if (len1 < len2) 6 swap(l1, l2); 7 ListNode* dummy = new ListNode(0); 8 ListNode* cur = dummy, *right = dummy; 9 int diff = abs(len1 - len2); 10 11 while (diff) { 12 cur->next = new ListNode(l1->val); 13 cur = cur->next; 14 if (cur->val != 9) 15 right = cur; 16 l1 = l1->next; 17 --diff; 18 } 19 while (l1) { 20 int sum = l1->val + l2->val; 21 cur->next = new ListNode(sum % 10); 22 cur = cur->next; 23 if (sum > 9) { 24 sum %= 10; 25 ++right->val; 26 right = right->next; 27 while (right!= cur) { 28 right->val = 0; 29 right = right->next; 30 } 31 } 32 if (sum != 9) 33 right = cur; 34 l1 = l1->next; 35 l2 = l2->next; 36 } 37 38 return dummy->val == 0 ? dummy->next : dummy; 39 } 40 int getLength(ListNode* head) { 41 if (!head) 42 return 0; 43 int len = 0; 44 while (head) { 45 ++len; 46 head = head->next; 47 } 48 return len; 49 } 50 };