class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null) return;
ListNode mid = getMid(head);
ListNode head2 = reverse(mid);
ListNode dummy = new ListNode(0);
ListNode curr = dummy, curr1 = head, curr2 = head2;
while (curr1 != null && curr2 != null) {
curr.next = curr1;
curr1 = curr1.next;
curr.next.next = curr2;
curr2 = curr2.next;
curr = curr.next.next;
}
if (curr1 != null) curr.next = curr1;
else if (curr2 != null) curr.next = curr2;
}
// split the linked list from mid, return the head of the 2nd part
// 注意特殊处理,需要让slow停在中点之前
private ListNode getMid(ListNode head) {
ListNode slow = head, fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode ret = slow.next;
slow.next = null;
return ret;
}
// reverse the input linked list, return its new head
private ListNode reverse(ListNode head) {
if (head == null || head.next == null) return head;
ListNode prev = head, next = null, curr = head.next;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
head.next = null;
return prev;
}
}