Reorder List — Split, Reverse, Merge
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