# 143-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. """ def findmiddle(head): slow = head fast = head while fast and fast.next: slow = slow.next fast = fast.next.next return slow.next, slow first = head second_half_start,first_end = findmiddle(first) def reverse(head): cur = head prev = None while cur: nxt = cur.next cur.next = prev prev = cur cur = nxt return prev if first_end is None: return head first_end.next = None second_half_start = reverse(second_half_start) def merge(head1, head2): res = cur = ListNode(None) while head1 or head2: if head1: res.next = head1 head1 = head1.next res = res.next if head2: res.next = head2 head2 = head2.next res = res.next while head1: res.next = head1 head1 = head1.next res = res.next while head2: res.next = head2 head2 = head2.next res = res.next return res.next head = merge(first, second_half_start) ```