본문 바로가기

알고리즘/LeetCode

Odd Even Linked List (Linked List)

LeetCode의 Odd Even Linked List 문제다.

 

Odd Even Linked List - LeetCode

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.

leetcode.com

연결 리스트가 주어졌을 때 홀수 번째의 노드와 짝수 번째의 노드끼리 묶어서 홀수 노드들 다음에 짝수 노드들이 오도록 재구성하는 문제다. 즉 노드 1, 노드 2, 노드 3, 노드 4, 노드 5가 있다면 노드 1, 노드 3, 노드 5, 노드 2, 노드 4로 다시 구성돼야 한다.

간단하게 생각한다면 그냥 연결 리스트를 탐색하면서 홀수 노드, 짝수 노드를 어디 저장해뒀다가 나중에 합치는 방식으로 생각할 수 있겠지만 문제에서 O(1) 공간 복잡도를 요구하기 때문에 연결 리스트의 연결 자체를 바꾸는 식으로 풀이해볼 수 있겠다.

 

내가 생각한 풀이 방법은 노드를 두 개씩 다루는 방법이었다. 그래서 홀수 번째(i) 노드, 짝수 번째(i+1) 노드가 있다면 홀수 번째 노드를 다음 홀수 번째(i+2) 노드와 연결시키고 짝수 번째 노드도 다음 짝수 번째(i+1+2) 노드와 연결시키면서 홀수 노드, 짝수 노드끼리 모으는 방법으로 구현하였다.

 

물론 이렇게 끼리끼리 이은 후에는 맨 마지막 홀수 노드의 다음 노드로 짝수 노드를 이어줘야 하기 때문에 맨 처음 짝수 노드는 별도의 변수에서 기억해야 했다. 이를 제외하면 별다른 로직은 없었다.

class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        # at least two nodes
        if head is None:
            return head
        
        # process odd nodes
        oddNode, evenNode, firstEvenNode = head, head.next, head.next
        
        while evenNode and evenNode.next:
            # 홀수 노드, 짝수 노드의 다음 노드를 다음 다음 노드로 설정 후 이동.
            oddNode.next, evenNode.next = oddNode.next.next, evenNode.next.next
            oddNode, evenNode = oddNode.next, evenNode.next
        
        # 마지막 홀수 노드의 다음 노드를 첫번째 짝수 노드로 설정.
        oddNode.next = firstEvenNode    
        return head

파이썬의 동시 할당 기능을 사용하여 어렵지 않게 풀 수 있었다.

'알고리즘 > LeetCode' 카테고리의 다른 글

Remove Duplicate Letters  (0) 2021.04.20
Reverse Linked List II  (0) 2021.04.16
Swap Nodes in Pairs (Linked List)  (0) 2021.03.23
Add Two Numbers (Linked List)  (0) 2021.03.09
Reverse Linked List (Linked List)  (0) 2021.03.09