好题!!!虽然简单当时还是要想很多东西的!
3步
//Find the middle of the list
//Reverse the half after middle 1->2->3->4->5->6 to 1->2->3->6->5->4
//Start reorder one by one 1->2->3->6->5->4 to 1->6->2->5->3->4
/**
* 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 == NULL || head -> next == NULL) return ;
ListNode* p1 = head;
ListNode* p2 = head;
while(p2 -> next != NULL && p2 -> next -> next != NULL){
p1 = p1 -> next;
p2 = p2 -> next -> next;
}
ListNode* preM = p1;
ListNode* preC = p1 -> next;
while(preC -> next != NULL){
ListNode* current = preC -> next;
preC -> next = current -> next;
current -> next = preM -> next;
preM -> next = current;
}
p1 = head;
p2 = preM -> next;
while(p1 != preM){
preM -> next = p2 -> next;
p2 -> next = p1 -> next;
p1 -> next = p2;
p1 = p2 -> next;
p2 = preM -> next;
}
}
};