思路:个人用的方法比较普通,利用栈和引用的特性,让他们一个后退一个前进,然后连接起来即可;另一个简介的思路就是,先用快慢指针找到中点,把原链表分成两个链表,然后将后链表逆序,再将后链表对应插入前链表即可;
void fun(ListNode *&head1, ListNode *head2, int &size, int now, bool &flag) { if (head2 == nullptr) //到达链表尾节点 { return; } size += 1;//size用于统计链表元素个数 fun(head1, head2->next, size, now + 1, flag); if (flag) //链表重排已完成,只需要一直return回去即可 { return; } if ((now - 1 == size / 2 && !(size & 1)) || head1 == head2)//如果排到了重点 { head2->next = nullptr; flag = true; } else { ListNode *temp = head1->next; head1->next = head2; head2->next = temp; head1 = temp; } } void reorderList(ListNode *head) { //栈+引用递归下去 ListNode *head1 = head, *head2 = head; int size = 0; bool flag = false; fun(head1, head2, size, 1, flag); }