Given 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.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
Code:
<span style="font-size:14px;">/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
ListNode *lessBegin = NULL, *lessEnd = NULL, *greaterBegin = NULL, *greaterEnd = NULL;
while (head != NULL) {
if (head->val < x) {
if (lessBegin == NULL) {
lessBegin = head;
lessEnd = head;
} else {
lessEnd->next = head;
lessEnd = head;
}
head = head->next;
lessEnd->next = NULL;
} else {
if (greaterBegin == NULL) {
greaterBegin = head;
greaterEnd = head;
} else {
greaterEnd->next = head;
greaterEnd = head;
}
head = head->next;
greaterEnd->next = NULL;
}
}
if (lessBegin != NULL) {
lessEnd->next = greaterBegin;
return lessBegin;
} else
return greaterBegin;
}
};</span>