Given a singly linked list L: 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}.
public class Solution {
public void reorderList(ListNode head) {
if(head==null||head.next==null){
return ;
}
ListNode fast=head.next;
ListNode slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
fast=slow.next;
slow.next=null;
merge(head,reverse(fast));
}
public static ListNode merge(ListNode h1,ListNode h2){
if(h1==null){
return h2;
}
if(h2==null){
return h1;
}
ListNode cur1=h1;
ListNode cur2=h2;
while(cur1!=null&&cur2!=null){
ListNode next=cur2.next;
cur2.next=cur1.next;
cur1.next=cur2;
cur1=cur1.next.next;
cur2=next;
}
return cur1;
}
public static ListNode reverse(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode pre=null;
ListNode next=null;
while(head!=null){
next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
}