diff --git a/work/1/Medium/Linked List/143.reorder-list.py b/work/1/Medium/Linked List/143.reorder-list.py index 2da591f..99136ca 100644 --- a/work/1/Medium/Linked List/143.reorder-list.py +++ b/work/1/Medium/Linked List/143.reorder-list.py @@ -18,7 +18,7 @@ L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → You may not modify the values in the list's nodes. Only nodes themselves may be changed. - + Example 1: @@ -30,15 +30,16 @@ Example 2: Input: head = [1,2,3,4,5] Output: [1,5,2,4,3] - + Constraints: - • The number of nodes in the list is in the range [1, 5 * 10^4]. + • The number of nodes in the list is in the range [1, 5 * 10^4]. - • 1 <= Node.val <= 1000 + • 1 <= Node.val <= 1000 """ + # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): @@ -46,7 +47,25 @@ Constraints: # self.next = next class Solution: def reorderList(self, head: ListNode | None) -> None: - """ - Do not return anything, modify head in-place instead. - """ - + # Find middle + slow, fast = head, head.next + while fast and fast.next: + slow = slow.next + fast = fast.next.next + + # Reverse second half + second = slow.next + prev = slow.next = None + while second: + tmp = second.next + second.next = prev + prev = second + second = tmp + + # merge two halfs + first, second = head, prev + while second: + tmp1, tmp2 = first.next, second.next + first.next = second + second.next = tmp1 + first, second = tmp1, tmp2