86. Partition List

Medium (Trung bình) C++ 🔗 Xem trên LeetCode

📋 Đề Bài

Given the head of a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

 

Example 1:

Input: head = [1,4,3,2,5,2], x = 3
Output: [1,2,2,4,3,5]

Example 2:

Input: head = [2,1], x = 2
Output: [1,2]

 

Constraints:

  • The number of nodes in the list is in the range [0, 200].
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

🧠 Thuật Toán & Kỹ Thuật

Linked List (Danh sách liên kết)
⏱️ Thời gian O(n)
💾 Không gian O(n)

💻 Lời Giải

C++ 0086-partition-list.cpp
/**
 * 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:
    ListNode* partition(ListNode* head, int x) {
        ListNode *left = new ListNode(0);
        ListNode *right = new ListNode(0);
        
        ListNode *tLeft = left, *tRight = right;
        
        while (head) {
            if (head->val < x) {
                tLeft->next = head;
                tLeft = tLeft->next;
            }
            else {
                tRight->next = head;
                tRight = tRight->next;
            }
            head = head->next;
        }
        
        tLeft->next = right->next;
        tRight->next = nullptr;
        
        return left->next;
    }
};