思路:找中间节点,将中间节点之后的节翻转,然后遍历中间节点前的节点的时候插入翻转后的节点
贴上代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverse(struct ListNode* head){
struct ListNode* prev=NULL;
struct ListNode* cur=head;
struct ListNode* Next=cur->next;
while(true){
cur->next=prev;
if(Next==NULL){
break;
}
prev=cur;
cur=Next;
Next=Next->next;
}
return cur;
}
void reorderList(struct ListNode* head) {
//一个或两个节点不需要排
if(head->next==NULL||head->next->next==NULL){
return;
}
//找中间节点位置
int len=0;
struct ListNode* cur=head;
while(cur){
len++;
cur=cur->next;
}
if(len%2==0){
len=len/2;
}else{
len=len/2+1;
}
//将cur置于翻转处
cur=head;
struct ListNode* prev=NULL;
while(len--){
prev=cur;
cur=cur->next;
}
prev->next=NULL;
//翻转后半部分
struct ListNode* nhead=reverse(cur);
//合并
cur=head;
struct ListNode* Next=NULL;
struct ListNode* nNext=NULL;
while(nhead){
Next=cur->next;
nNext=nhead->next;
cur->next=nhead;
nhead->next=Next;
nhead=nNext;
cur=Next;
}
}