采用递归就可以做,类似于树的后续遍历。需要同时维护一个指向链表前半部分的指针p2(指向了要插入的位置,可以采用全局变量或数组引用的方式来维护)。
注意,在p2已经到达链表末尾时整个过程就结束了,这里采用一个全局标记end来标记是否已经结束。
class Solution {
public:
bool end;
void travel(ListNode*p1, ListNode*&p2){
if(!p1->next)return;
travel(p1->next,p2);
if(end||p1==p2||!p2->next){
end=1;
return;
}
p1->next->next=p2->next;
p2->next=p1->next;
p2=p1->next->next;
p1->next=NULL;
}
void reorderList(ListNode *head) {
if(!head||!head->next||!head->next->next)return;
end=0;
travel(head,head);
}
};