思路
首先将链表一份为二,首先对链表进行计数,cnt。如果cnt小于等于二说明不用更改直接返回。
否则找到将链表一分为二,循环(cnt + 1) / 2-1次,得到前一个链表的最后一个节点mid。
获取到下一个链表的第一个结点later,再把mid的next变为nullptr,对later进行反转。
反转前将cnt赋值为0,计算后一链表的长度最后决定应该执行几次插入操作。
C++ 代码
class Solution {
public:
void reorderList(ListNode* head) {
int cnt = 0;
for (auto i = head; i; i = i->next) cnt ++;
if (cnt <= 2) return;
auto mid = head;
for (int i = 1; i < (cnt + 1) / 2;i ++) mid = mid->next;
cnt = 0;
auto later = mid->next;
mid->next = nullptr;
ListNode* pre = nullptr;
while (later){
auto ne = later->next;
later->next = pre;
pre = later, later = ne;
cnt ++;
}
for (int i = 0; i < cnt; i ++){
later = pre->next;
pre->next = head->next;
head->next = pre;
head = pre->next;
pre = later;
}
}
};