Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions reorder-list/DaleSeo.rs
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Fast & Slow Pointers, Reverse Linked List
  • 설명: 이 코드는 빠른/느린 포인터를 활용하여 리스트를 반으로 나누고, 뒤집기 위해 역순 연결 리스트를 만든 후 병합하는 방식으로 문제를 해결합니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(n) O(n)
Space O(1) O(1)

피드백: 리스트 길이 계산, 절반 찾기, 뒤집기, 병합의 각 단계가 모두 리스트 크기 비례하는 선형 시간에 수행됩니다. 추가 공간은 포인터 변수들만 사용하므로 상수입니다.

개선 제안: 현재 구현이 적절해 보입니다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// TC: O(n)
// SC: O(1)
impl Solution {
pub fn reorder_list(head: &mut Option<Box<ListNode>>) {
let mut len = 0;
let mut curr = head.as_ref();
while let Some(node) = curr {
len += 1;
curr = node.next.as_ref();
}
if len < 3 {
return;
}

let mut tail = {
let mut node = head.as_mut().unwrap();
for _ in 0..(len - 1) / 2 {
node = node.next.as_mut().unwrap();
}
node.next.take()
};

let mut reversed = None;
while let Some(mut n) = tail {
tail = n.next.take();
n.next = reversed;
reversed = Some(n);
}

let mut node = head.as_mut().unwrap();
while let Some(mut r) = reversed {
reversed = r.next.take();
r.next = node.next.take();
node.next = Some(r);
if reversed.is_none() {
break;
}
node = node.next.as_mut().unwrap().next.as_mut().unwrap();
}
}
}
Loading