1 Description #
source: https://leetcode.com/problems/partition-list/
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
2 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:
ListNode *partition(ListNode *head, int x) {
// Time complexity: O(N), N is the size of linked_list
// Space complexity: O(1)
if (!head) {
return head;
}
ListNode *first_less_x = nullptr;
ListNode *last_less_x = nullptr;
ListNode *last_greater_x = nullptr;
ListNode *first_greater_x = nullptr;
while (head) {
if (head->val < x) {
first_less_x = (first_less_x == nullptr ? head : first_less_x);
if (!last_less_x) {
last_less_x = head;
} else {
last_less_x->next = head;
last_less_x = last_less_x->next;
}
} else {
first_greater_x = (first_greater_x == nullptr ? head : first_greater_x);
if (!last_greater_x) {
last_greater_x = head;
} else {
last_greater_x->next = head;
last_greater_x = last_greater_x->next;
}
}
head = head->next;
}
if (last_greater_x) {
last_greater_x->next = nullptr;
}
if (last_less_x) {
last_less_x->next = first_greater_x;
}
return first_less_x != nullptr ? first_less_x : first_greater_x;
}
};