Skip to content

Commit 404ae2c

Browse files
authored
Update 092._reverse_linked_list_ii.md
1 parent d2f5931 commit 404ae2c

File tree

1 file changed

+72
-27
lines changed

1 file changed

+72
-27
lines changed
Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,30 @@
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
难度:
@@ -14,7 +37,7 @@ Medium
1437

1538
AC 代码
1639

17-
```
40+
```python
1841
class 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

Comments
 (0)