0143. Reorder List
Last updated
Last updated
**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;
}
}