Leetcode - 92. Reverse Linked List II

문제

Loading...
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

주어진 범위 내의 링크드 리스트를 뒤집는 문제이다.

정답

다른 링크드 리스트 문제들과 비슷하게 두 가지로 접근이 가능하다.

1. 바꾸고자 하는 범위를 추출한 다음, 새로운 리스트를 생성해 원래 리스트에 이어붙인다.

2. 리스트를 순회하면서 바로 이어붙인다.

어쨌든 전체 리스트를 2번 순회해야 하기 때문에, 시간복잡도는 동일하지만 공간복잡도 면에서 두번째 방법이 유리하다. 사실 항상 두번째 방법이 유리할 수밖에 없긴 하다.

문제 해결 아이디어는 다음과 같다. 시작과 끝에 해당하는 노드를 저장한다. 그 다음 리스트를 순회하면서, end 가 바라보는 다음 노드를 start 의 다음 노드로, end.next 가 바라보는 다음 노드는 end 의 다음 노드로 지정한다. 이때 현재 이동하고 있는 리스트를 저장해둬야 하기 때문에 temp 변수를 별도로 지정해 사용한다.

class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        # early terminate
        if not head or left == right:
            return head

        # "root" and "start" should be the same, to return start of the linked list.
        root = start = ListNode()
        # Acutally, "start" starts from head.
        start.next = head

        # before left index, find start and end nodes
        for _ in range(left - 1):
            start = start.next
        end = start.next

        # now reverse nodes between left <= idx <= right
        for _ in range(right - left):
            temp, start.next, end.next = start.next, end.next, end.next.next
            start.next.next = temp

        return root.next