原题如下:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
class Solution {
public:
void reorderList(ListNode *head) {
if(head == NULL || head->next == NULL)
return;
ListNode *fast = head, *slow = head;
while(fast->next != NULL && fast->next->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
fast = slow->next;
slow->next = NULL;
fast = reverse(fast);
merge(head,fast);
return;
}
ListNode* reverse(ListNode *head){
if(head == NULL || head->next == NULL)
return head;
ListNode *p = head->next,*post = head->next;
head->next = NULL;
while(p != NULL){
post = p->next;
p->next = head;
head = p;
p = post;
}
return head;
}
ListNode *merge(ListNode *head1, ListNode *head2){
ListNode *head = new ListNode(0);
ListNode *p = head;
while(head1 != NULL && head2 != NULL){
p->next = head1;
head1 = head1->next;
p->next->next = head2;
p = head2;
head2 = head2->next;
}
if(head1 != NULL)
p->next = head1;
else
p->next = head2;
head1 = head->next;
delete head;
return head1;
}
};