题目: 参考:https://leetcode-cn.com/problems/reorder-list/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-34/ 给定一个单链表 L : L 0 → L 1 → … → L n − 1 → L n , L:L_0→L_1→…→L_{n-1}→L_n , L:L0→L1→…→Ln−1→Ln, 将其重新排列后变为: L 0 → L n → L 1 → L n − 1 → L 2 → L n − 2 → … L_0→L_n→L_1→L_{n-1}→L_2→L{n-2}→… L0→Ln→L1→Ln−1→L2→Ln−2→…
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/*
*先通过快慢指针,将链表划分为前后部分,后部分倒序
*再将这2部分合并即可
*/
void reorderList(ListNode* head) {
if(head == nullptr || head->next == nullptr || head->next->next == nullptr)
return;
ListNode *fast = head;
ListNode *slow = head;
while(fast->next != nullptr && fast->next->next != nullptr) {
fast = fast->next->next;
slow = slow->next;
}
ListNode *newhead = slow->next;
slow->next = nullptr;//
newhead = reverselist(newhead);
while(newhead != nullptr) {
ListNode *tmp = newhead->next;
newhead->next = head->next;
head->next = newhead;
head = newhead->next;
newhead = tmp;
}
}
ListNode* reverselist(ListNode *head) {
if(head == nullptr) return head;
ListNode *pre = head;
head = head->next;
pre->next = nullptr;//
while(head != nullptr) {
ListNode *tmp = head->next;
head->next = pre;
pre = head;
head = tmp;
}
return pre;
}
};