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+ 125
226# 1. 两数相加
327
@@ -85,12 +109,12 @@ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
85109
86110``` java
87111public class ListNode {
88- int val;
89- ListNode next = null ;
112+ int val;
113+ ListNode next = null ;
90114
91- ListNode (int val ) {
92- this . val = val;
93- }
115+ ListNode (int val ) {
116+ this . val = val;
117+ }
94118}
95119```
96120
@@ -103,47 +127,47 @@ public class ListNode {
103127 */
104128public class Solution {
105129
106- public ListNode ReverseList (ListNode head ) {
107- 108- ListNode next = null ;
109- ListNode pre = null ;
130+ public ListNode ReverseList (ListNode head ) {
110131
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+ }
123147
124148}
125149```
126150
127151测试方法:
128152
129153``` 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+ }
147171```
148172
149173输出:
@@ -185,33 +209,33 @@ public class ListNode {
185209// 时间复杂度O(n),一次遍历即可
186210// https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
187211public 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+ }
215239}
216240```
217241
@@ -264,29 +288,29 @@ public class Solution {
264288 */
265289// https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/description/
266290public 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+ }
290314}
291315```
292316
@@ -314,28 +338,28 @@ public class Solution {
314338 * }
315339 */
316340public 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+ }
333357
334- node2. next = node2. next. next;
358+ node2. next = node2. next. next;
335359
336- return dummy. next;
360+ return dummy. next;
337361
338- }
362+ }
339363}
340364```
341365
0 commit comments