給定單鏈表 L0→L1→…→Ln-1→Ln,重排為 L0→Ln→L1→Ln-1→L2→Ln-2→… 原地操作,不修改節點值。
class Solution {
public:
ListNode* findMid(ListNode* head) {
ListNode *slow = head, *fast = head;
while (fast && fast->next) { fast = fast->next->next; slow = slow->next; }
return slow;
}
ListNode* reverse(ListNode* head) {
ListNode *prev = nullptr, *curr = head;
while (curr) { ListNode* nxt = curr->next; curr->next = prev; prev = curr; curr = nxt; }
return prev;
}
void reorderList(ListNode* head) {
if (!head) return;
ListNode* mid = findMid(head);
ListNode* second = reverse(mid->next);
mid->next = nullptr;
ListNode* first = head;
while (second) {
ListNode* fnext = first->next;
ListNode* snext = second->next;
first->next = second;
second->next = fnext;
first = fnext;
second = snext;
}
}
};