# reorder-list Try it on leetcode ## Description

You are given the head of a singly linked-list. The list can be represented as:

L0 → L1 → … → Ln - 1 → Ln

Reorder the list to be on the following form:

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:

Input: head = [1,2,3,4]
Output: [1,4,2,3]

Example 2:

Input: head = [1,2,3,4,5]
Output: [1,5,2,4,3]

 

Constraints:

## Solution(Python) ```Python # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reorderList(self, head: Optional[ListNode]) -> None: """ Do not return anything, modify head in-place instead. """ # find the middle point slow = head fast = head while fast and fast.next: fast = fast.next.next slow = slow.next # detach into two lists node1 = head node2 = slow.next slow.next = None # reverse the second list prev = None curr = node2 next_ = None while curr: next_ = curr.next curr.next = prev prev = curr curr = next_ node2 = prev # alternatively attach the two lists curr = ListNode(0) while node1 or node2: if node1: curr.next = node1 node1 = node1.next curr = curr.next if node2: curr.next = node2 node2 = node2.next curr = curr.next head = curr.next # Time Complexity = O(n) # Space Complexity = O(1) ```