本题源自LeetCode
-------------------------------------------------------------
1 先找到链表的中间节点,再将后半部分节点反转
2 在将后部分节点
void reorderList(ListNode *head) {
if(head==NULL)
return ;
ListNode* fast=head;
ListNode* slow=head;
while(fast->next!=NULL && fast->next->next!=NULL){
slow=slow->next;
fast=fast->next->next;
}
//将后半部节点反转
ListNode* pre=slow->next;
if(pre&&pre->next){
ListNode* pNext=pre->next;
while(pNext){
pre->next=pNext->next;
pNext->next=slow->next;
slow->next=pNext;
pNext=pre->next;
}
}
merge(head,slow);
}
void merge(ListNode* root1,ListNode* root2){
ListNode* p=root1;
ListNode* q=root2->next;
while(p&&q){
root2->next=q->next;
q->next=p->next;
p->next=q;
q=root2->next;
p=p->next->next;
}
}
一次插入前半部分