问题描述:
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
解题思路:
由于是按照正常顺序排序,即最高位在最前面。
但是加法要从最低位开始。
所以我们可以用栈存储每一个节点。
将栈顶元素相加。
直至两栈为空。
空间复杂度O(m+n)
时间复杂度O(max(m+n))
代码:
/** * 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) { if(!l1) return l2; if(!l2) return l1; stack<ListNode*> s1, s2; ListNode* cur1 = l1; ListNode* cur2 = l2; while(cur1){ s1.push(cur1); cur1 = cur1->next; } while(cur2){ s2.push(cur2); cur2 = cur2->next; } ListNode* last = NULL; int carry = 0; while(!s1.empty() && !s2.empty()){ int val = s1.top()->val + s2.top()->val + carry; s1.pop(); s2.pop(); carry = val / 10; val %= 10; ListNode* cur = new ListNode(val); cur->next = last; last = cur; } while(!s1.empty()){ int val = s1.top()->val + carry; carry = val / 10; val %= 10; s1.pop(); ListNode* cur = new ListNode(val); cur->next = last; last = cur; } while(!s2.empty()){ int val = s2.top()->val + carry; carry = val / 10; val %= 10; s2.pop(); ListNode* cur = new ListNode(val); cur->next = last; last = cur; } if(carry != 0){ ListNode* cur = new ListNode(carry); cur->next = last; last = cur; } return last; } };
换一种写法:
/** * 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) { if(!l1) return l2; if(!l2) return l1; stack<ListNode*> s1, s2; ListNode* cur1 = l1; ListNode* cur2 = l2; while(cur1){ s1.push(cur1); cur1 = cur1->next; } while(cur2){ s2.push(cur2); cur2 = cur2->next; } ListNode* last = NULL; int carry = 0; while(!s1.empty() || !s2.empty() || carry != 0){ int val1 = 0, val2 = 0; if(!s1.empty()){ val1 = s1.top()->val; s1.pop(); } if(!s2.empty()){ val2 = s2.top()->val; s2.pop(); } int val = val1 + val2 + carry; carry = val / 10; val %= 10; ListNode* cur = new ListNode(val); cur->next = last; last = cur; } return last; } };