Skip to content

Commit e9c8e39

Browse files
committed
143. 重排链表
1 parent 2d3ce8b commit e9c8e39

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

linkedlist/143_reorderList.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Definition for singly-linked list.
2+
class ListNode:
3+
def __init__(self, val=0, next=None):
4+
self.val = val
5+
self.next = next
6+
7+
8+
class Solution:
9+
def reorderList(self, head: ListNode) -> None:
10+
"""
11+
Do not return anything, modify head in-place instead.
12+
"""
13+
if not head:
14+
return
15+
vec = list()
16+
17+
node = head
18+
while node:
19+
vec.append(node)
20+
node = node.next
21+
22+
i, j = 0, len(vec) - 1
23+
24+
while i < j:
25+
vec[i].next = vec[j]
26+
i += 1
27+
vec[j].next = vec[i]
28+
j -= 1
29+
vec[i].next = None
30+
31+
def reorderList_2(self, head: ListNode) -> None:
32+
def find_mid(head: ListNode):
33+
slow = fast = head
34+
while fast.next and fast.next.next:
35+
slow = slow.next
36+
fast = fast.next.next
37+
return slow
38+
39+
def reverse(head: ListNode):
40+
pre = None
41+
cur = head
42+
while cur:
43+
tmp = cur.next
44+
cur.next = pre
45+
pre = cur
46+
cur = tmp
47+
return pre
48+
49+
def merge(l1: ListNode, l2: ListNode):
50+
while l1 and l2:
51+
tmp1 = l1.next
52+
tmp2 = l2.next
53+
54+
l1.next = l2
55+
l1 = tmp1
56+
l2.next = l1
57+
l2 = tmp2
58+
59+
if not head:
60+
return
61+
mid = find_mid(head)
62+
l1, l2 = head, mid.next
63+
mid.next = None
64+
l2 = reverse(l2)
65+
merge(l1, l2)
66+
67+
68+
if __name__ == '__main__':
69+
node1 = ListNode(1)
70+
node2 = ListNode(2)
71+
node3 = ListNode(3)
72+
node4 = ListNode(4)
73+
node5 = ListNode(5)
74+
node1.next = node2
75+
node2.next = node3
76+
node3.next = node4
77+
node4.next = node5
78+
79+
solution = Solution()
80+
print(solution.reorderList_2(node1))

0 commit comments

Comments
 (0)