1- ## # 92 . Reverse Linked List II
1+ # 92. Reverse Linked List II
22
3- 题目:
4- < https://leetcode.com/problems/reverse-linked-list-ii/ >
3+ ** <font color =red >难度: Medium</font >**
4+
5+ ## 刷题内容
6+
7+ > 原题连接
8+
9+ * https://leetcode.com/problems/reverse-linked-list-ii/description/
10+
11+ > 内容描述
12+
13+ ```
14+ Reverse a linked list from position m to n. Do it in one-pass.
15+
16+ Note: 1 ≤ m ≤ n ≤ length of list.
17+
18+ Example:
19+
20+ Input: 1->2->3->4->5->NULL, m = 2, n = 4
21+ Output: 1->4->3->2->5->NULL
22+ ```
23+
24+ ## 解题方案
25+
26+ > 思路 1
27+ ****** - 时间复杂度: O(N)****** - 空间复杂度: O(1)******
528
629
730难度:
1437
1538AC 代码
1639
17- ```
40+ ``` python
1841class Solution (object ):
1942 def reverseBetween (self , head , m , n ):
2043 """
@@ -23,44 +46,66 @@ class Solution(object):
2346 :type n: int
2447 :rtype: ListNode
2548 """
26- # m == n, not reverse
27- if m == n : return head
28-
29- dummy = ListNode(-1)
49+ if not head or m == n:
50+ return head
51+ node_m_before = dummy = ListNode(- 1 )
3052 dummy.next = head
31-
32- mbefore = dummy
33- cnt = 1
3453
35- while mbefore and cnt < m:
36- mbefore = mbefore.next
37- cnt += 1
54+ for i in range (m- 1 ):
55+ node_m_before = node_m_before.next
3856
3957 prev = None
40- cur = mbefore .next
41- tail1 = mbefore .next
58+ cur = node_m_before .next
59+ node_m = node_m_before .next
4260
43-
44- while cnt <= n :
61+ for i in range (n- m+ 1 ):
4562 nxt = cur.next
4663 cur.next = prev
4764 prev = cur
4865 cur = nxt
49- cnt += 1
5066
51-
52-
53- mbefore.next = prev
54- tail1.next = cur
67+ node_m_before.next = prev
68+ node_m.next = cur
5569
5670 return dummy.next
5771```
5872
73+ > 思路 2
74+ ****** - 时间复杂度: O(N)****** - 空间复杂度: O(1)******
75+
5976看了一下别人的代码,又比我写的好嘛,因为是保证m和n有效,用的是for循环先找到 m node:
6077
78+ 详细见[ realisking] ( https://leetcode.com/problems/reverse-linked-list-ii/discuss/30709/Talk-is-cheap-show-me-the-code-(and-DRAWING) )
79+ ```
80+ for _ in range(m-1):
81+ ....
6182
62- for _ in range(m-1 ):
63- ....
83+ for _ in range(n-m ):
84+ reverse 操作
6485
65- for _ in range(n-m):
66- reverse 操作
86+ ```
87+ ``` python
88+ class Solution (object ):
89+ def reverseBetween (self , head , m , n ):
90+ """
91+ :type head: ListNode
92+ :type m: int
93+ :type n: int
94+ :rtype: ListNode
95+ """
96+ if not head or m == n:
97+ return head
98+ p = dummy = ListNode(None )
99+ dummy.next = head
100+ for i in range (m- 1 ):
101+ p = p.next
102+ tail = p.next
103+
104+ for i in range (n- m):
105+ tmp = p.next
106+ p.next = tail.next
107+ tail.next = tail.next.next
108+ p.next.next = tmp
109+ return dummy.next
110+ ```
111+
0 commit comments