class Solution {
public:
void reorderList(ListNode *head)
{
if (!head) {
return;
}
ListNode *a, *b;
splitList(head, a, b);
b = reverseList(b, NULL);
head = mergeList(a, b);
}
int lenList(ListNode *head)
{
int len = 0;
while (head) {
len++;
head = head -> next;
}
return len;
}
void splitList(ListNode *head, ListNode *&a, ListNode *& b)
{
int len = lenList(head);
int la = (len + 1) >> 1;
a = head;
for (int i = 0; i < la - 1; i++) {
head = head -> next;
}
b = head -> next;
head -> next = NULL;
}
ListNode* reverseList(ListNode *now, ListNode *pre)
{
if (!now) return pre;
ListNode *next = now -> next;
now -> next = pre;
return reverseList(next, now);
}
ListNode* mergeList(ListNode *a, ListNode *b)
{
ListNode *head = NULL, *tail = NULL;
int ptr = 1;
while (a || b) {
ListNode *&c = ptr? a : b;
if (head) {
tail -> next = c;
tail = tail -> next;
} else {
head = tail = c;
}
c = c -> next;
tail -> next = NULL;
ptr ^= 1;
}
return head;
}
};