143. Reorder List

https://leetcode.com/problems/reorder-list/

Problem

Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:

Given 1->2->3->4, reorder it to 1->4->2->3.

Example 2:

Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

Solution

/**
 * 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;
        }
    }
};
  • #linkedlist

  • #stack

Last updated

Was this helpful?