Given 1->2->3->4, reorder it to 1->4->2->3.
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if (head == nullptr) return;
ListNode node;
ListNode *dummy_head = &node;
dummy_head->next = head;
ListNode *slow = dummy_head;
ListNode *fast = dummy_head->next;
while (fast != nullptr) {
slow = slow->next;
fast = fast->next;
if (fast != nullptr) fast = fast->next;
}
fast = slow->next;
slow->next = nullptr;
stack<ListNode*> stack;
while (fast != nullptr) {
stack.push(fast);
fast = fast->next;
}
slow = head;
while (slow != nullptr && !stack.empty()) {
fast = slow->next;
slow->next = stack.top();
slow->next->next = fast;
stack.pop();
slow = fast;
}
}
};