leetcode刷题: 002 Add Two Numbers
2015-05-25 13:38
337 查看
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) + (1 -> 2 -> 3)=(2 -> 3 -> 6)
运行结果:
![](http://images0.cnblogs.com/blog2015/718161/201505/251335300847962.jpg)
然后实现不等长无进位的求和,即实现 (1 —> 2 -> 3) + (1)=(2 -> 2 -> 3)
运行结果:
![](http://images0.cnblogs.com/blog2015/718161/201505/251334596933510.jpg)
最后实现不等长有进位的求和,即实现题目要求(注意最后一位有进位的情况)
运行结果:
![](http://images0.cnblogs.com/blog2015/718161/201505/251334120532290.jpg)
因为是一边学C++,一边刷leetcode,所以有什么问题,十分感谢您能指点。
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8
首先使用链表实现等长无进位的求和,即实现 (1 —> 2 -> 3) + (1 -> 2 -> 3)=(2 -> 3 -> 6)
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int val1 = 0, val2 = 0; ListNode *l = NULL; ListNode *l_end = NULL; ListNode *l_new = NULL; val1 = l1->val; val2 = l2->val; l1 = l1->next; l2 = l2->next; l_new = (ListNode *)new ListNode((val1 + val2) % 10); l_new->next = NULL; l = l_new; l_end = l; while (l1 != NULL || l2 != NULL){ val1 = l1->val; val2 = l2->val; l1 = l1->next; l2 = l2->next; l_new = (ListNode *)new ListNode((val1 + val2)%10); l_new->next = NULL; l_end->next = l_new; l_end = l_new; } return l; } }; int main() { ListNode *l1, *l2; ListNode *l; l1 = (ListNode *)new ListNode(1); l2 = (ListNode *)new ListNode(1); l1->next = (ListNode *)new ListNode(2); l2->next = (ListNode *)new ListNode(2); l1->next->next = (ListNode *)new ListNode(3); l2->next->next = (ListNode *)new ListNode(3); Solution s; l = s.addTwoNumbers(l1, l2); while (l != NULL){ cout << l->val << endl; l = l->next; } while (1); }
运行结果:
![](http://images0.cnblogs.com/blog2015/718161/201505/251335300847962.jpg)
然后实现不等长无进位的求和,即实现 (1 —> 2 -> 3) + (1)=(2 -> 2 -> 3)
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int val1 = 0, val2 = 0; ListNode *l = NULL; ListNode *l_end = NULL; ListNode *l_new = NULL; val1 = l1->val; val2 = l2->val; l1 = l1->next; l2 = l2->next; l_new = (ListNode *)new ListNode((val1 + val2) % 10); l_new->next = NULL; l = l_new; l_end = l; while (l1 != NULL || l2 != NULL){ if (l1 == NULL){ val2 = l2->val; l2 = l2->next; val1 = 0; } else if (l2 == NULL){ val1 = l1->val; l1 = l1->next; val2 = 0; } else{ val1 = l1->val; val2 = l2->val; l1 = l1->next; l2 = l2->next; } l_new = (ListNode *)new ListNode((val1 + val2)%10); l_new->next = NULL; l_end->next = l_new; l_end = l_new; } return l; } }; int main() { ListNode *l1, *l2; ListNode *l; l1 = (ListNode *)new ListNode(1); l2 = (ListNode *)new ListNode(1); l1->next = (ListNode *)new ListNode(2); //l2->next = (ListNode *)new ListNode(2); l1->next->next = (ListNode *)new ListNode(3); //l2->next->next = (ListNode *)new ListNode(3); Solution s; l = s.addTwoNumbers(l1, l2); while (l != NULL){ cout << l->val << endl; l = l->next; } while (1); }
运行结果:
![](http://images0.cnblogs.com/blog2015/718161/201505/251334596933510.jpg)
最后实现不等长有进位的求和,即实现题目要求(注意最后一位有进位的情况)
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int val1 = 0, val2 = 0, carry = 0; ListNode *l = NULL; ListNode *l_end = NULL; ListNode *l_new = NULL; val1 = l1->val; val2 = l2->val; l1 = l1->next; l2 = l2->next; l_new = (ListNode *)new ListNode((val1 + val2 + carry) % 10); l_new->next = NULL; l = l_new; carry = (val1 + val2 + carry) / 10; l_end = l; while (l1 != NULL || l2 != NULL){ if (l1 == NULL){ val2 = l2->val; l2 = l2->next; val1 = 0; } else if (l2 == NULL){ val1 = l1->val; l1 = l1->next; val2 = 0; } else{ val1 = l1->val; val2 = l2->val; l1 = l1->next; l2 = l2->next; } l_new = (ListNode *)new ListNode((val1 + val2 + carry)%10); l_new->next = NULL; carry = (val1 + val2 + carry) / 10; l_end->next = l_new; l_end = l_new; } if (carry != 0){ l_new = (ListNode *)new ListNode(carry); l_new->next = NULL; l_end->next = l_new; l_end = l_new; } return l; } }; int main() { ListNode *l1, *l2; ListNode *l; l1 = (ListNode *)new ListNode(1); l2 = (ListNode *)new ListNode(1); l1->next = (ListNode *)new ListNode(2); l2->next = (ListNode *)new ListNode(9); l1->next->next = (ListNode *)new ListNode(2); l2->next->next = (ListNode *)new ListNode(7); Solution s; l = s.addTwoNumbers(l1, l2); while (l != NULL){ cout << l->val << endl; l = l->next; } while (1); }
运行结果:
![](http://images0.cnblogs.com/blog2015/718161/201505/251334120532290.jpg)
因为是一边学C++,一边刷leetcode,所以有什么问题,十分感谢您能指点。
相关文章推荐
- leetcode [002] : Add Two Numbers
- LeetCode 002 Add Two Numbers
- LeetCode 002 Add Two Numbers
- leetcode-002 Add Two Numbers
- Leetcode_002_Add_Two_Numbers
- leetcode 002 Add Two Numbers
- Add Two Numbers - leetcode002
- 2017-09-07 LeetCode_002 Add Two Numbers
- [LeetCode 002] Add Two Numbers
- 【leetcode】002 Add Two Numbers
- LeetCode 002-Add Two Numbers
- 002 Add Two Numbers [Leetcode]
- leetcode002:Add Two Numbers
- LeetCode 002 AddTwoNumbers
- leetcode 002 Add_Two_Numbers
- 002 Add Two Numbers [Leetcode]
- LeetCode 002 AddTwoNumbers
- leetcode解题方案--002--AddTwoNumbers
- LeetCode002 Add Two Numbers
- LeetCode 002 Add Two Numbers