55
55
56
56
了解了思路,但是想完全实现代码也不是特别容易,这里需要注意的三个点就是,
57
57
58
- 1.我们需要根据两个链表的长度,不断对新链表添加节点
58
+ 1 . 我们需要根据两个链表的长度,不断对新链表添加节点。
59
59
60
- 2.需要创建一个变量用来保存进位值。
60
+ 2 . 需要创建一个变量用来保存进位值。
61
61
62
- 3.当跳出循环之后,需要根据进位值来判断需不需要再对链表长度加1.
62
+ 3 . 当跳出循环之后,需要根据进位值来判断需不需要再对链表长度加1。
63
63
64
64
这三条可以结合代码理解进行。
65
65
@@ -78,8 +78,8 @@ Java Code:
78
78
``` java
79
79
class Solution {
80
80
public ListNode addTwoNumbers (ListNode l1 , ListNode l2 ) {
81
- // 返回链表
82
- ListNode nList = new ListNode (- 1 );
81
+ // 待会儿要返回的链表
82
+ ListNode nList = new ListNode (- 1 );// 虚拟头节点
83
83
ListNode tempnode = nList;
84
84
// 用来保存进位值,初始化为0
85
85
int summod = 0 ;
@@ -92,7 +92,7 @@ class Solution {
92
92
int sum = l1num+ l2num+ summod;
93
93
// 更新进位值,例18/10=1,9/10=0
94
94
summod = sum/ 10 ;
95
- // 新节点保存的值,18 % 8=2,则添加2
95
+ // 新节点保存的值,18% 8=2,则添加2
96
96
sum = sum% 10 ;
97
97
// 添加节点
98
98
tempnode. next = new ListNode (sum);
@@ -106,10 +106,10 @@ class Solution {
106
106
}
107
107
}
108
108
// 最后根据进位值判断需不需要继续添加节点
109
- if (summod == 1 ) {
109
+ if (summod != 0 ) {
110
110
tempnode. next = new ListNode (summod);
111
111
}
112
- return nList. next;
112
+ return nList. next;// 去除-1节点
113
113
}
114
114
}
115
115
```
@@ -120,8 +120,8 @@ C++ Code:
120
120
class Solution {
121
121
public:
122
122
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
123
- //返回链表
124
- ListNode * nList = new ListNode(-1);
123
+ //待会儿要返回的链表
124
+ ListNode * nList = new ListNode(-1);//虚拟头节点
125
125
ListNode * tempnode = nList;
126
126
//用来保存进位值,初始化为0
127
127
int summod = 0;
@@ -134,7 +134,7 @@ public:
134
134
int sum = l1num + l2num + summod;
135
135
//更新进位值,例18/10=1,9/10=0
136
136
summod = sum / 10;
137
- //新节点保存的值,18 % 8=2,则添加2
137
+ //新节点保存的值,1 % 8=2,则添加2
138
138
sum = sum % 10;
139
139
//添加节点
140
140
tempnode->next = new ListNode(sum);
@@ -148,11 +148,85 @@ public:
148
148
}
149
149
}
150
150
//最后根据进位值判断需不需要继续添加节点
151
- if (summod == 1 ) {
151
+ if (summod != 0 ) {
152
152
tempnode->next = new ListNode(summod);
153
153
}
154
- return nList->next;
154
+ return nList->next;//去除-1节点
155
155
}
156
156
};
157
157
```
158
158
159
+ JS Code:
160
+
161
+ ```js
162
+ var addTwoNumbers = function(l1, l2) {
163
+ //待会儿要返回的链表
164
+ let nList = new ListNode(-1);//虚拟头节点
165
+ let tempnode = nList;
166
+ //用来保存进位值,初始化为0
167
+ let summod = 0;
168
+ while (l1 || l2) {
169
+ //如果l1的链表为空则l1num为0,若是不为空,则为链表的节点值
170
+ //判断是否为空,为空就设为0
171
+ let l1num = l1 === null ? 0 : l1.val;
172
+ let l2num = l2 === null ? 0 : l2.val;
173
+ //将链表的值和进位值相加,得到为返回链表的值
174
+ let sum = l1num + l2num + summod;
175
+ //更新进位值,例18/10=1,9/10=0
176
+ summod = ~~(sum / 10);
177
+ //新节点保存的值,1 %8=2,则添加2
178
+ sum = sum % 10;
179
+ //添加节点
180
+ tempnode.next = new ListNode(sum);
181
+ //移动指针
182
+ tempnode = tempnode.next;
183
+ if (l1) {
184
+ l1 = l1.next;
185
+ }
186
+ if (l2) {
187
+ l2 = l2.next;
188
+ }
189
+ }
190
+ //最后根据进位值判断需不需要继续添加节点
191
+ if (summod !== 0) {
192
+ tempnode.next = new ListNode(summod);
193
+ }
194
+ return nList.next;//去除-1节点
195
+ };
196
+ ```
197
+
198
+ Python Code:
199
+
200
+ ``` py
201
+ class Solution :
202
+ def addTwoNumbers (self , l1 : ListNode, l2 : ListNode) -> ListNode:
203
+ # 待会儿要返回的链表
204
+ nList = ListNode(- 1 ) # 虚拟头节点
205
+ tempnode = nList
206
+ # 用来保存进位值,初始化为0
207
+ summod = 0
208
+ while l1 is not None and l2 is not None :
209
+ # 如果l1的链表为空则l1num为0,若是不为空,则为链表的节点值
210
+ # 判断是否为空,为空就设为0
211
+ l1num = 0 if l1 is None else l1.val
212
+ l2num = 0 if l2 is None else l2.val
213
+ # 将链表的值和进位值相加,得到为返回链表的值
214
+ sum_ = l1num + l2num + summod
215
+ # 更新进位值,例18/10=1,9/10=0
216
+ # 新节点保存的值,1 %8=2,则添加2
217
+ # 注:这里使用divmod函数,对上方的代码进行了一丢丢的简化
218
+ summod, sum_ = divmod (sum_, 10 )
219
+ # 添加节点
220
+ tempnode.next = ListNode(sum_)
221
+ # 移动指针
222
+ tempnode = tempnode.next
223
+ if l1 is not None :
224
+ l1 = l1.next
225
+ if l2 is not None :
226
+ l2 = l2.next
227
+ # 最后根据进位值判断需不需要继续添加节点
228
+ if summod != 0 :
229
+ tempnode.next = ListNode(summod)
230
+ return nList.next # 去除-1节点
231
+ ```
232
+
0 commit comments