Leetcode Python - 61. Rotate List

Leetcode #61 - Rotate List

이번에는 특정 챕터별로 문제들을 풀어보겠습니다. linkedlist를 집중적으로 풀어보겠습니다.

리트코드의 문제 61 ‘Rotate List’을 파이썬으로 풀어 보도록 하겠습니다.

포인트는 k번씩 rotate를 하는 함수를 호출하는 방식으로 풀었습니다.

전체 코드는 아래와 같습니다.

class Solution:
    def rotateRight(self, head, k):
        if not k or not head or not head.next:
            return head
        node = head
        length = 0
        while node:
            node = node.next
            length += 1
        for _ in range(k%length):
            head = self.rotateOnce(head)
        return head
            
    def rotateOnce(self, head):
        dummy = ListNode(0)
        dummy.next = head
        prev = cur = dummy
        cur = cur.next
        
        while cur and cur.next:
            cur = cur.next
            prev = prev.next
        
        prev.next = None
        cur.next = head
        head = cur
        
        return head

시간복잡도는 O(kn) : 한번 rotate를 할 때마다 n씩 소요 * k번

공간복잡도는 O(1) : dummy LisNode를 생성


개선하기

포인트는 마지막과 첫번째 노드를 연결후 시작점과 끊어줄 지점을 구하는 것입니다.

class Solution:
    def rotateRight(self, head, k):
        if not k:
            return head
        elif not head:
            return None
        
        fast = last = head
        
        length = 1
        while last.next:
            last = last.next
            length += 1
        
        k = k%length
        for _ in range(length - k -1):
            fast = fast.next
        
        last.next = head
        head = fast.next
        fast.next = None
        return head

시간복잡도는 O(n) : 처음 while문에서 n번 loop + for문에서 n번 loop

공간복잡도는 O(1) : fast, last listNode 생성