You are given the head of a singly linked-list. The list can be represented as:
L0 → L1 → … → Ln - 1 → Ln
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.
**Input:** head = [1,2,3,4]
**Output:** [1,4,2,3]
**Input:** head = [1,2,3,4,5]
**Output:** [1,5,2,4,3]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
// corner cases
if (head == null || head.next == null || head.next.next == null) return;
// find mid, O(n)
ListNode fast = head, slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
// reverese second half, O(n/2)
ListNode l2 = slow.next;
slow.next = null;
ListNode prev = null;
while (l2 != null ){
ListNode tmp = l2;
l2 = l2.next;
tmp.next = prev;
prev = tmp;
}
l2 = prev;
// merge O(n)
ListNode l1 = head.next;
ListNode ranger = head;
while (l1 != null) {
ranger.next = l2;
l2 = l2.next;
ranger = ranger.next;
ranger.next = l1;
l1 = l1.next;
ranger = ranger.next;
}
ranger.next = l2;
}
}