
思路:
先把链表一分为二 快慢指针 快指针一下移两步 慢指针一下移一步 快指针到终点时慢指针刚好到一半
ListNode* fast=head;
ListNode* slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
ListNode* mid=slow->next;
//本题特殊 因为重排后刚好中间两个数的相对位置不变
slow->next=nullptr;
ListNode* prev=nullptr;
再把第二个链表逆序 定义一个前驱 把每个节点都头插在这个前驱后面
while(mid)
{
ListNode* next=mid->next;
mid->next=prev;
prev=mid;
mid=next;
}
再合并两个链表 把第二个链表插到第一个里面去
ListNode* dummy=head;
while(prev)
{
ListNode* fir=dummy->next;
ListNode* sec=prev->next;
dummy->next=prev;
prev->next=fir;
dummy=fir;
prev=sec;
LeetCode143重排链表解析
460

被折叠的 条评论
为什么被折叠?



