两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题(from:xiao-lin-20)
1 #include <iostream> 2 #include <vector> 3 4 struct ListNode { 5 int val; 6 ListNode *next; 7 ListNode(int x) : val(x), next(nullptr) {} 8 }; 9 10 class Solution { 11 public: 12 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 13 // 使用prenode而不需要单独考虑头节点,以简化代码 14 ListNode *prenode = new ListNode(0); 15 ListNode *lastnode = prenode; 16 int val = 0; 17 while (val || l1 || l2) { 18 val = val + (l1 ? l1->val : 0) + (l2 ? l2->val : 0); 19 lastnode->next = new ListNode(val % 10); 20 lastnode = lastnode->next; 21 val = val / 10; 22 l1 = l1 ? l1->next : nullptr; 23 l2 = l2 ? l2->next : nullptr; 24 } 25 ListNode *res = prenode->next; 26 delete prenode; // 释放额外引入的prenode 27 return res; 28 } 29 }; 30 31 ListNode* generateListNode(std::vector<int> vals); 32 void freeListNode(ListNode* head); 33 void printListNode(ListNode* head); 34 35 int main() 36 { 37 auto list1 = generateListNode({ 1, 4, 6 }); 38 auto list2 = generateListNode({ 9, 4, 6, 9 }); 39 printListNode(list1); 40 printListNode(list2); 41 Solution s; 42 auto sum = s.addTwoNumbers(list1, list2); 43 printListNode(sum); 44 freeListNode(list1); 45 freeListNode(list2); 46 freeListNode(sum); 47 return 0; 48 } 49 50 ListNode* generateListNode(std::vector<int> vals) 51 { 52 ListNode *res = nullptr; 53 ListNode *last = nullptr; 54 for (auto val : vals) { 55 if (last) { 56 last->next = new ListNode(val); 57 last = last->next; 58 } 59 else { 60 res = new ListNode(val); 61 last = res; 62 } 63 } 64 return res; 65 } 66 67 void freeListNode(ListNode* head) 68 { 69 ListNode* node = head; 70 while (node) { 71 auto temp = node->next; 72 delete node; 73 node = temp; 74 } 75 } 76 77 void printListNode(ListNode* head) 78 { 79 ListNode* node = head; 80 while (node) { 81 std::cout << node->val << ", "; 82 node = node->next; 83 } 84 std::cout << std::endl; 85 }