Given a singly linked listL:L0→L1→…→Ln-1→Ln,
reorder it to:L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given{1,2,3,4}
, reorder it to{1,4,2,3}
.
tag: linkedlist
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null) return;
ListNode slow = head, fast = head, prev = null, l1 = head;
while (fast != null && fast.next != null){
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
prev.next = null;
ListNode l2 = reverse(slow);
merge(l1, l2);
}
private ListNode reverse(ListNode head){
ListNode prev = null;
while (head != null){
ListNode next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
}
private void merge(ListNode l1, ListNode l2){
while (l1 != null){
ListNode n1 = l1.next, n2 = l2.next;
l1.next = l2;
if (n1 == null) break;
l2.next = n1;
l1 = n1;
l2 = n2;
}
}
}