diff --git a/0328-odd-even-linked-list/0328-odd-even-linked-list.py b/0328-odd-even-linked-list/0328-odd-even-linked-list.py new file mode 100644 index 0000000..201f636 --- /dev/null +++ b/0328-odd-even-linked-list/0328-odd-even-linked-list.py @@ -0,0 +1,50 @@ +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]: + """ + Complexities: + Time: O(n) + Space: O(1) + + where n = len(head) + """ + + # If len(head) <= 2, already sorted + if not head or not head.next: + return head + + oddHead = head + oddTail = head + evenHead = head.next + evenTail = head.next + + currNode = head.next.next + isOddIndex = True + + # Set tail.next = None + oddTail.next = None + evenTail.next = None + + # Separate list into odd list and even list + while currNode: + nextNode = currNode.next + currNode.next = None + + if isOddIndex: + oddTail.next = currNode + oddTail = currNode + else: + evenTail.next = currNode + evenTail = currNode + + currNode = nextNode + isOddIndex = not isOddIndex + + # Attach both lists + oddTail.next = evenHead + + return oddHead