两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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 }

 

posted @ 2019-10-09 13:20  const_wss  阅读(221)  评论(0编辑  收藏  举报