File tree Expand file tree Collapse file tree 1 file changed +63
-0
lines changed Expand file tree Collapse file tree 1 file changed +63
-0
lines changed Original file line number Diff line number Diff line change
1
+ """
2
+ Constraints:
3
+ - The number of nodes in the list is in the range [1, 5 * 10^4].
4
+ - 1 <= Node.val <= 1000
5
+
6
+ Time Complexity: O(n)
7
+ - 리스트를 한 번씩 순회하면서 알고리즘의 각 단계를 수행함
8
+
9
+ Space Complexity: O(1)
10
+ - 정해진 개수의 변수 외에는 추가 공간을 사용하지 않음
11
+
12
+ 풀이방법:
13
+ 1. 중간 지점 찾기
14
+ - slow/fast 포인터를 사용하여 중간 지점 찾기
15
+ 2. 뒷부분 뒤집기
16
+ - prev, curr 포인터로 링크드 리스트의 방향 전환
17
+ - next_temp에 다음 노드를 저장한 후 방향 변경
18
+ 3. 앞부분과 뒷부분 합치기
19
+ - 두 리스트의 시작점(first, second)부터 시작
20
+ - temp1, temp2에 다음 노드 저장
21
+ - 포인터들을 번갈아가며 연결함
22
+ """
23
+ # Definition for singly-linked list.
24
+ # class ListNode:
25
+ # def __init__(self, val=0, next=None):
26
+ # self.val = val
27
+ # self.next = next
28
+ class Solution :
29
+ def reorderList (self , head : Optional [ListNode ]) -> None :
30
+ """
31
+ Do not return anything, modify head in-place instead.
32
+ """
33
+ # 중간 지점 찾기
34
+ slow = head
35
+ fast = head
36
+ while fast and fast .next :
37
+ slow = slow .next
38
+ fast = fast .next .next
39
+
40
+ # 뒷부분 뒤집기
41
+ prev = None
42
+ curr = slow .next
43
+ slow .next = None
44
+ while curr :
45
+ next_temp = curr .next
46
+ curr .next = prev
47
+ prev = curr
48
+ curr = next_temp
49
+
50
+ # 앞부분과 뒷부분 합치기
51
+ first = head
52
+ second = prev
53
+ while second :
54
+ temp1 = first .next
55
+ temp2 = second .next
56
+
57
+ first .next = second
58
+ second .next = temp1
59
+
60
+ first = temp1
61
+ second = temp2
62
+
63
+
You can’t perform that action at this time.
0 commit comments