public static void reorderList(ListNode head) {//AC, bug-free
    	
    	if (head == null || head.next == null) return;
    	ListNode fast = head;
    	ListNode slow = head;
    	while (fast.next != null && fast.next.next != null) {
    		slow = slow.next;
    		fast = fast.next.next;
    	}
    	ListNode tail = slow;
    	slow = slow.next;
    	tail.next = null;
    	//then, reverse the second half
    	ListNode temp = reverseList(slow);
    	//then, merge
    	head = interleaveLists(head, temp);
    	
    }