1
+ // 其实题目中限制了不能对原始链表进行修改反倒是好事,这样就容易了很多
2
+ // 实践之后发现把问题想的太简单了,这样写最大的问题就是很容易溢出
3
+ // 1560 / 1563 test cases passed.
4
+
5
+ /* *
6
+ * Definition for singly-linked list.
7
+ * struct ListNode {
8
+ * int val;
9
+ * ListNode *next;
10
+ * ListNode(int x) : val(x), next(NULL) {}
11
+ * };
12
+ */
13
+
14
+ class Solution
15
+ {
16
+ public:
17
+ ListNode* addTwoNumbers (ListNode* l1, ListNode* l2)
18
+ {
19
+ long long sum1 = 0 , sum2 = 0 ;
20
+
21
+ ListNode* ptr1 = l1;
22
+ ListNode* ptr2 = l2;
23
+
24
+ while (ptr1)
25
+ {
26
+ sum1 *= 10 ;
27
+ sum1 += ptr1->val ;
28
+ ptr1 = ptr1->next ;
29
+ }
30
+
31
+ while (ptr2)
32
+ {
33
+ sum2 *= 10 ;
34
+ sum2 += ptr2->val ;
35
+ ptr2 = ptr2->next ;
36
+ }
37
+
38
+ long long res = sum1 + sum2;
39
+
40
+ // 根据计算出来的和,构建链表
41
+ ListNode dummyHead (0 );
42
+
43
+ while (res != 0 )
44
+ {
45
+ int val = res % 10 ;
46
+
47
+ ListNode* node = new ListNode (val);
48
+ ListNode* temp = dummyHead.next ;
49
+
50
+ dummyHead.next = node;
51
+ node->next = temp;
52
+
53
+ res /= 10 ;
54
+ }
55
+ return dummyHead.next ;
56
+ }
57
+ };
58
+
59
+
60
+ // 所以使用堆栈来模拟加法过程
61
+ // Runtime: 24 ms, faster than 74.03% of C++ online submissions for Add Two Numbers II.
62
+ // Memory Usage: 13 MB, less than 51.85% of C++ online submissions for Add Two Numbers II.
63
+
64
+ /* *
65
+ * Definition for singly-linked list.
66
+ * struct ListNode {
67
+ * int val;
68
+ * ListNode *next;
69
+ * ListNode(int x) : val(x), next(NULL) {}
70
+ * };
71
+ */
72
+
73
+ class Solution
74
+ {
75
+ public:
76
+ ListNode* addTwoNumbers (ListNode* l1, ListNode* l2)
77
+ {
78
+ stack<ListNode*> stack1, stack2;
79
+
80
+ ListNode* ptr1 = l1;
81
+ ListNode* ptr2 = l2;
82
+
83
+ while (ptr1)
84
+ {
85
+ stack1.push (ptr1);
86
+ ptr1 = ptr1->next ;
87
+ }
88
+
89
+ while (ptr2)
90
+ {
91
+ stack2.push (ptr2);
92
+ ptr2 = ptr2->next ;
93
+ }
94
+
95
+ int base = 0 , carry = 0 ;
96
+ ListNode dummyHead (0 );
97
+ while (!stack1.empty () && !stack2.empty ())
98
+ {
99
+ ptr1 = stack1.top ();
100
+ stack1.pop ();
101
+
102
+ ptr2 = stack2.top ();
103
+ stack2.pop ();
104
+
105
+ base = (ptr1->val + ptr2->val + carry) % 10 ;
106
+ carry = (ptr1->val + ptr2->val + carry) / 10 ;
107
+
108
+ ListNode* node = new ListNode (base);
109
+ ListNode* temp = dummyHead.next ;
110
+
111
+ dummyHead.next = node;
112
+ node->next = temp;
113
+ }
114
+
115
+ while (!stack1.empty ())
116
+ {
117
+ ptr1 = stack1.top ();
118
+ stack1.pop ();
119
+
120
+ base = (ptr1->val + carry) % 10 ;
121
+ carry = (ptr1->val + carry) / 10 ;
122
+
123
+ ListNode* node = new ListNode (base);
124
+ ListNode* temp = dummyHead.next ;
125
+
126
+ dummyHead.next = node;
127
+ node->next = temp;
128
+ }
129
+
130
+ while (!stack2.empty ())
131
+ {
132
+ ptr2 = stack2.top ();
133
+ stack2.pop ();
134
+
135
+ base = (ptr2->val + carry) % 10 ;
136
+ carry = (ptr2->val + carry) / 10 ;
137
+
138
+ ListNode* node = new ListNode (base);
139
+ ListNode* temp = dummyHead.next ;
140
+
141
+ dummyHead.next = node;
142
+ node->next = temp;
143
+ }
144
+
145
+ // 这里要特别注意一下 [5]+[5]=[1][0]
146
+ if (carry != 0 )
147
+ {
148
+ ListNode* node = new ListNode (carry);
149
+ ListNode* temp = dummyHead.next ;
150
+
151
+ dummyHead.next = node;
152
+ node->next = temp;
153
+ }
154
+
155
+ return dummyHead.next ;
156
+ }
157
+ };
0 commit comments