1
+ """
2
+ 143. Reorder List
3
+ https://leetcode.com/problems/reorder-list/
4
+ """
5
+
6
+ from typing import Optional
7
+
8
+ class ListNode :
9
+ def __init__ (self , val = 0 , next = None ):
10
+ self .val = val
11
+ self .next = next
12
+
13
+ """
14
+ Solution:
15
+ To reorder the linked list, we can follow these steps:
16
+ First, find the middle of the linked list using the slow and fast pointers.
17
+ Reverse the second half of the linked list.
18
+ Merge the first half and the reversed second half.
19
+
20
+ 1. Find the middle of the linked list using the slow and fast pointers
21
+ - Initialize the slow and fast pointers to the head of the linked list
22
+ - Move the slow pointer by one step and the fast pointer by two steps
23
+ until the fast pointer reaches the end of the linked list.
24
+ 2. Reverse the second half of the linked list
25
+ - Initialize the prev and curr pointers to None and the middle node, respectively
26
+ - Iterate through the second half of the linked list
27
+ - Store the next node of the current node
28
+ - Reverse the current node
29
+ - Move the prev and curr pointers to the next nodes
30
+ 3. Merge the first half and the reversed second half
31
+ - Initialize the first and second pointers to the head and the reversed second half, respectively
32
+ - Iterate through the linked list
33
+ - Store the next nodes of the first and second pointers
34
+ - Update the next pointers of the first and second pointers
35
+ - Move the first and second pointers to the next nodes
36
+
37
+ Time complexity: O(N)
38
+ - We iterate through the linked list to find the middle node and reverse the second half
39
+ - The time complexity is O(N)
40
+
41
+ Space complexity: O(1)
42
+ - We only use constant extra space for the pointers
43
+ - The space complexity is O(1)
44
+
45
+ """
46
+
47
+
48
+ class Solution :
49
+ def reorderList (self , head : Optional [ListNode ]) -> None :
50
+ """
51
+ Do not return anything, modify head in-place instead.
52
+ """
53
+ if not head or not head .next :
54
+ return
55
+
56
+ slow , fast = head , head
57
+ while fast and fast .next :
58
+ slow = slow .next
59
+ fast = fast .next .next
60
+
61
+ prev , curr = None , slow
62
+ while curr :
63
+ next_temp = curr .next
64
+ curr .next = prev
65
+ prev = curr
66
+ curr = next_temp
67
+
68
+ first , second = head , prev
69
+ while second .next :
70
+ tmp1 , tmp2 = first .next , second .next
71
+ first .next = second
72
+ second .next = tmp1
73
+ first , second = tmp1 , tmp2
0 commit comments