1
+ <!-- MarkdownTOC -->
2
+
3
+ - [ 1. 两数相加] ( #1-两数相加 )
4
+ - [ 题目描述] ( #题目描述 )
5
+ - [ 问题分析] ( #问题分析 )
6
+ - [ Solution] ( #solution )
7
+ - [ 2. 翻转链表] ( #2-翻转链表 )
8
+ - [ 题目描述] ( #题目描述-1 )
9
+ - [ 问题分析] ( #问题分析-1 )
10
+ - [ Solution] ( #solution-1 )
11
+ - [ 3. 链表中倒数第k个节点] ( #3-链表中倒数第k个节点 )
12
+ - [ 题目描述] ( #题目描述-2 )
13
+ - [ 问题分析] ( #问题分析-2 )
14
+ - [ Solution] ( #solution-2 )
15
+ - [ 4. 删除链表的倒数第N个节点] ( #4-删除链表的倒数第n个节点 )
16
+ - [ 问题分析] ( #问题分析-3 )
17
+ - [ Solution] ( #solution-3 )
18
+ - [ 5. 合并两个排序的链表] ( #5-合并两个排序的链表 )
19
+ - [ 题目描述] ( #题目描述-3 )
20
+ - [ 问题分析] ( #问题分析-4 )
21
+ - [ Solution] ( #solution-4 )
22
+
23
+ <!-- /MarkdownTOC -->
24
+
1
25
2
26
# 1. 两数相加
3
27
@@ -85,12 +109,12 @@ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
85
109
86
110
``` java
87
111
public class ListNode {
88
- int val;
89
- ListNode next = null ;
112
+ int val;
113
+ ListNode next = null ;
90
114
91
- ListNode (int val ) {
92
- this . val = val;
93
- }
115
+ ListNode (int val ) {
116
+ this . val = val;
117
+ }
94
118
}
95
119
```
96
120
@@ -103,47 +127,47 @@ public class ListNode {
103
127
*/
104
128
public class Solution {
105
129
106
- public ListNode ReverseList (ListNode head ) {
107
-
108
- ListNode next = null ;
109
- ListNode pre = null ;
130
+ public ListNode ReverseList (ListNode head ) {
110
131
111
- while (head != null ) {
112
- // 保存要反转到头的那个节点
113
- next = head. next;
114
- // 要反转的那个节点指向已经反转的上一个节点(备注:第一次反转的时候会指向null)
115
- head. next = pre;
116
- // 上一个已经反转到头部的节点
117
- pre = head;
118
- // 一直向链表尾走
119
- head = next;
120
- }
121
- return pre;
122
- }
132
+ ListNode next = null ;
133
+ ListNode pre = null ;
134
+
135
+ while (head != null ) {
136
+ // 保存要反转到头的那个节点
137
+ next = head. next;
138
+ // 要反转的那个节点指向已经反转的上一个节点(备注:第一次反转的时候会指向null)
139
+ head. next = pre;
140
+ // 上一个已经反转到头部的节点
141
+ pre = head;
142
+ // 一直向链表尾走
143
+ head = next;
144
+ }
145
+ return pre;
146
+ }
123
147
124
148
}
125
149
```
126
150
127
151
测试方法:
128
152
129
153
``` java
130
- public static void main(String [] args) {
131
-
132
- ListNode a = new ListNode (1 );
133
- ListNode b = new ListNode (2 );
134
- ListNode c = new ListNode (3 );
135
- ListNode d = new ListNode (4 );
136
- ListNode e = new ListNode (5 );
137
- a. next = b;
138
- b. next = c;
139
- c. next = d;
140
- d. next = e;
141
- new Solution (). ReverseList(a);
142
- while (e != null ) {
143
- System . out. println(e. val);
144
- e = e. next;
145
- }
146
- }
154
+ public static void main(String [] args) {
155
+
156
+ ListNode a = new ListNode (1 );
157
+ ListNode b = new ListNode (2 );
158
+ ListNode c = new ListNode (3 );
159
+ ListNode d = new ListNode (4 );
160
+ ListNode e = new ListNode (5 );
161
+ a. next = b;
162
+ b. next = c;
163
+ c. next = d;
164
+ d. next = e;
165
+ new Solution (). ReverseList(a);
166
+ while (e != null ) {
167
+ System . out. println(e. val);
168
+ e = e. next;
169
+ }
170
+ }
147
171
```
148
172
149
173
输出:
@@ -185,33 +209,33 @@ public class ListNode {
185
209
// 时间复杂度O(n),一次遍历即可
186
210
// https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
187
211
public class Solution {
188
- public ListNode FindKthToTail (ListNode head , int k ) {
189
- // 如果链表为空或者k小于等于0
190
- if (head == null || k <= 0 ) {
191
- return null ;
192
- }
193
- // 声明两个指向头结点的节点
194
- ListNode node1 = head, node2 = head;
195
- // 记录节点的个数
196
- int count = 0 ;
197
- // 记录k值,后面要使用
198
- int index = k;
199
- // p指针先跑,并且记录节点数,当node1节点跑了k-1个节点后,node2节点开始跑,
200
- // 当node1节点跑到最后时,node2节点所指的节点就是倒数第k个节点
201
- while (node1 != null ) {
202
- node1 = node1. next;
203
- count++ ;
204
- if (k < 1 && node1 != null ) {
205
- node2 = node2. next;
206
- }
207
- k-- ;
208
- }
209
- // 如果节点个数小于所求的倒数第k个节点,则返回空
210
- if (count < index)
211
- return null ;
212
- return node2;
213
-
214
- }
212
+ public ListNode FindKthToTail (ListNode head , int k ) {
213
+ // 如果链表为空或者k小于等于0
214
+ if (head == null || k <= 0 ) {
215
+ return null ;
216
+ }
217
+ // 声明两个指向头结点的节点
218
+ ListNode node1 = head, node2 = head;
219
+ // 记录节点的个数
220
+ int count = 0 ;
221
+ // 记录k值,后面要使用
222
+ int index = k;
223
+ // p指针先跑,并且记录节点数,当node1节点跑了k-1个节点后,node2节点开始跑,
224
+ // 当node1节点跑到最后时,node2节点所指的节点就是倒数第k个节点
225
+ while (node1 != null ) {
226
+ node1 = node1. next;
227
+ count++ ;
228
+ if (k < 1 && node1 != null ) {
229
+ node2 = node2. next;
230
+ }
231
+ k-- ;
232
+ }
233
+ // 如果节点个数小于所求的倒数第k个节点,则返回空
234
+ if (count < index)
235
+ return null ;
236
+ return node2;
237
+
238
+ }
215
239
}
216
240
```
217
241
@@ -264,29 +288,29 @@ public class Solution {
264
288
*/
265
289
// https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/description/
266
290
public class Solution {
267
- public ListNode removeNthFromEnd (ListNode head , int n ) {
268
- // 哑结点,哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部
269
- ListNode dummy = new ListNode (0 );
270
- // 哑结点指向头结点
271
- dummy. next = head;
272
- // 保存链表长度
273
- int length = 0 ;
274
- ListNode len = head;
275
- while (len != null ) {
276
- length++ ;
277
- len = len. next;
278
- }
279
- length = length - n;
280
- ListNode target = dummy;
281
- // 找到 L-n 位置的节点
282
- while (length > 0 ) {
283
- target = target. next;
284
- length-- ;
285
- }
286
- // 把第 (L - n)个结点的 next 指针重新链接至第 (L - n + 2)个结点
287
- target. next = target. next. next;
288
- return dummy. next;
289
- }
291
+ public ListNode removeNthFromEnd (ListNode head , int n ) {
292
+ // 哑结点,哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部
293
+ ListNode dummy = new ListNode (0 );
294
+ // 哑结点指向头结点
295
+ dummy. next = head;
296
+ // 保存链表长度
297
+ int length = 0 ;
298
+ ListNode len = head;
299
+ while (len != null ) {
300
+ length++ ;
301
+ len = len. next;
302
+ }
303
+ length = length - n;
304
+ ListNode target = dummy;
305
+ // 找到 L-n 位置的节点
306
+ while (length > 0 ) {
307
+ target = target. next;
308
+ length-- ;
309
+ }
310
+ // 把第 (L - n)个结点的 next 指针重新链接至第 (L - n + 2)个结点
311
+ target. next = target. next. next;
312
+ return dummy. next;
313
+ }
290
314
}
291
315
```
292
316
@@ -314,28 +338,28 @@ public class Solution {
314
338
* }
315
339
*/
316
340
public class Solution {
317
- public ListNode removeNthFromEnd (ListNode head , int n ) {
318
-
319
- ListNode dummy = new ListNode (0 );
320
- dummy. next = head;
321
- // 声明两个指向头结点的节点
322
- ListNode node1 = dummy, node2 = dummy;
323
-
324
- // node1 节点先跑,node1节点 跑到第 n 个节点的时候,node2 节点开始跑
325
- // 当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点,也就是倒数第 n+1(L代表总链表长度)
326
- while (node1 != null ) {
327
- node1 = node1. next;
328
- if (n < 1 && node1 != null ) {
329
- node2 = node2. next;
330
- }
331
- n-- ;
332
- }
341
+ public ListNode removeNthFromEnd (ListNode head , int n ) {
342
+
343
+ ListNode dummy = new ListNode (0 );
344
+ dummy. next = head;
345
+ // 声明两个指向头结点的节点
346
+ ListNode node1 = dummy, node2 = dummy;
347
+
348
+ // node1 节点先跑,node1节点 跑到第 n 个节点的时候,node2 节点开始跑
349
+ // 当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点,也就是倒数第 n+1(L代表总链表长度)
350
+ while (node1 != null ) {
351
+ node1 = node1. next;
352
+ if (n < 1 && node1 != null ) {
353
+ node2 = node2. next;
354
+ }
355
+ n-- ;
356
+ }
333
357
334
- node2. next = node2. next. next;
358
+ node2. next = node2. next. next;
335
359
336
- return dummy. next;
360
+ return dummy. next;
337
361
338
- }
362
+ }
339
363
}
340
364
```
341
365
0 commit comments