(Linked List, Medium) Reorder List

송재호·2025년 8월 8일
0

https://leetcode.com/problems/reorder-list/description/

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
순서대로 정렬하라는데..

중간을 찾아서 중간 뒤에서부터는 역순으로 정렬하고 머지하는 과정이 필요하겠다.
중간은 fast, slow 포인터로 O(N)으로 찾을 수 있다.

slow는 한 칸씩, fast는 두 칸씩 이동해서 없을 때까지 찾으면 최종적으로 slow 포인터는 딱 중간에 위치하게 된다.

이후 slow.next를 시작으로 뒤집으면 절반의 뒤집어진 리스트를 얻을 수 있다.
구했으면 slow.next를 명확히 null로 끊어주고,

그 다음 우리가 원하는 대로 머지를 해주면 된다.
(정방향리스트 -> 역방향리스트 -> 정방향리스트 -> 역방향리스트 ...)

class Solution {
    public void reorderList(ListNode head) {
        
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        ListNode reversed = reverse(slow.next);
        slow.next = null;

        ListNode origin = head;

        while (reversed != null) {
            ListNode temp1 = origin.next;
            ListNode temp2 = reversed.next;

            origin.next = reversed;
            reversed.next = temp1;

            origin = temp1;
            reversed = temp2;
        }
    }

    private ListNode reverse(ListNode head) {
        ListNode prev = null;
        ListNode current = head;

        while (current != null) {
            ListNode temp = current.next;
            current.next = prev;
            prev = current;
            current = temp;
        }

        return prev;
    }
}
profile
식지 않는 감자

0개의 댓글