diff --git a/apps/docs/content/(02-nodal-grid)/linked-list/143_reorder-list.mdx b/apps/docs/content/(02-nodal-grid)/linked-list/143_reorder-list.mdx new file mode 100644 index 0000000..925f7fd --- /dev/null +++ b/apps/docs/content/(02-nodal-grid)/linked-list/143_reorder-list.mdx @@ -0,0 +1,61 @@ +--- +title: '143. Reorder List' +description: 'You are given the head of a singly linked-list. The list can be represented as:' +icon: dot +topics: + - { name: "Linked List", slug: "linked-list" } + - { name: "Two Pointers", slug: "two-pointers" } + - { name: "Stack", slug: "stack" } + - { name: "Recursion", slug: "recursion" } +issue: "https://github.com/prdlk/leetcode/issues/81" +sidebar: + label: 'Reorder List' + badge: 'Medium' +--- + +### 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: + +- The number of nodes in the list is in the range [1, 5 * 10^4]. +- `1 <= Node.val <= 1000` + +## Solution + +```py +# 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: ListNode | None) -> None: + # 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 +```