문제 링크
https://leetcode.com/problems/odd-even-linked-list/
나의 풀이
소스 코드
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def my_solution(self, head: ListNode) -> ListNode:
# 홀수 순서 연결 리스트의 루트
odd_root = head
# 짝수 순서 연결 리스트, 짝수 번째 포인터
even_root = even = None
while head and head.next:
# 짝수 순서 연결 리스트에 연결
if even:
even.next = head.next
even = even.next
else:
even_root = even = head.next
# 홀수 순서 연결 리스트에 연결
if head.next.next:
head.next = head.next.next
head = head.next
else:
# 전체 연결 리스트의 노드 개수가 짝수일 때
# 마지막에 저장한 홀수 연결 리스트 노드와 짝수 연결 리스트를 연결
head.next = even_root
break
# 짝수 연결 리스트의 마지막 노드를 제거
if head and even:
even.next = None
head.next = even_root
return odd_root
문제 풀이
반복 구조로 홀짝 노드 처리
- 사용된 변수(
odd
,even
,even_head
)는n
의 크기에 관계 없이 항상 일정하게 사용되므로 공간 복잡도 O(1)을 만족한다.
소스 코드
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def solution1(self, head: ListNode) -> ListNode:
# 예외 처리
if head is None:
return None
odd = head
even = head.next
even_head = head.next
# 반복하면서 홀짝 노드 처리
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