Reorder List — Split, Reverse, Merge

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem 220 · Reorder List

Difficulty: Medium · Pattern: Split + Reverse + Merge

L0→L1→…→Ln → L0→Ln→L1→Ln-1→…

Solutions

# Python
def reorderList(head):
    # 1. Find middle
    slow = fast = head
    while fast.next and fast.next.next:
        slow = slow.next; fast = fast.next.next
    # 2. Reverse second half
    prev, curr = None, slow.next
    slow.next = None
    while curr:
        nxt = curr.next; curr.next = prev; prev = curr; curr = nxt
    # 3. Merge
    l1, l2 = head, prev
    while l2:
        l1.next, l2.next, l1, l2 = l2, l1.next, l1.next, l2.next
// Java
public void reorderList(ListNode head) {
    ListNode slow = head, fast = head;
    while (fast.next != null && fast.next.next != null) {
        slow = slow.next; fast = fast.next.next;
    }
    ListNode prev = null, curr = slow.next;
    slow.next = null;
    while (curr != null) {
        ListNode nxt = curr.next; curr.next = prev; prev = curr; curr = nxt;
    }
    ListNode l1 = head, l2 = prev;
    while (l2 != null) {
        ListNode t1 = l1.next, t2 = l2.next;
        l1.next = l2; l2.next = t1;
        l1 = t1; l2 = t2;
    }
}

Complexity

  • Time: O(n)
  • Space: O(1)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro