코딩 테스트/파이썬 알고리즘 인터뷰
Python 알고리즘 인터뷰 - 문제18. 홀짝 연결 리스트
스마트코더91
2024. 1. 23. 09:56
leetcode 328. Odd Even Linked List
연결 리스트를 홀수 번째 노드 다음에 짝수 번째 노드가 오도록 재구성하라. 공간 복잡도 O(1), 시간 복잡도 O(n)에 풀이하라
예제1
입력
1->2->3->4->5->None
출력
1->3->5->2->4->None
예제2
입력
2->1->3->5->6->4->7->None
출력
2->3->6->7->1->5->4->None
풀이
공간 복잡도에 대한 제약이 없으면 LinkedList를 list로 변환한 후 홀수, 짝수 슬라이싱을 각각 이어 붙힌 후 역으로 LinkedList를 만들면 된다. 여기에는 공간복잡도에 대해 명시해 있으니 해당 편법은 쓰지 않고 노드의 연결을 바꾸는 방식으로 진행한다.
먼저 odd = head, even = head.next로 포인터를 설정 후 2개의 노드씩 이동하면서 연결을 진행한다.
짝수, 홀수별 노드의 연결 후 odd, even 포인터를 이동시킨다.
연결 및 이동은 even, even.next가 None이 아닐 때까지 진행하며 코드는 다음과 같다.
while even and even.next:
odd.next, even.next = odd.next.next, even.next.next
odd, even = odd.next, even.next
노드 연결이 끝나면 odd 노드에서 even 노드의 시작점을 연결한다. 처음 포인터를 초기화할 때 even_head = even으로 설정하여 odd를 even_head에 향하게 한다.
전체 코드는 다음과 같다.
def oddEvenList(self, head):
if head is None:
return head
odd = head
even = head.next
even_head = even
while even and even.next:
odd.next, even.next = odd.next.next, even.next.next
odd, even = odd.next, even.next
odd.next = even_head
return head
head가 None인 경우 even = head.next를 초기화할 때 예외가 발생하므로 예외처리를 해준다.