https://leetcode.com/problems/reorder-list/
//#143 Reorder List
//64ms 97.92%
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head)
{
if(!head || !head->next || !head->next->next) return;
//size == 0; size == 1; size == 2
ListNode *p1(head), *p2(head);
while(p2->next && p2->next->next)
{
p1 = p1->next;
p2 = p2->next->next;
}
if(p1->next && p1->next->next && !p1->next->next->next)
{
p1->next->next->next = p1->next;
p1->next = p1->next->next;
p1->next->next->next = NULL;
}
else if(p1->next && p1->next->next && p1->next->next->next)
{
ListNode *previous_p(p1->next), *current_p(p1->next->next), *next_p(p1->next->next->next);
previous_p->next = NULL;
while(next_p != NULL)
{
current_p->next = previous_p;
previous_p = current_p;
current_p = next_p;
next_p = next_p->next;
}
current_p->next = previous_p;
p1->next = current_p;
}
p2 = head;
//list_print(head);
while(p1->next && p1 != p2)
{
ListNode *tmp(p2->next);
p2->next = p1->next;
p1->next = p1->next->next;
p2->next->next = tmp;
//cout << "ok?\n";
p2 = p2->next->next;
//cout << "ok?\n";
}
return;
}
};