-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPartition List.cpp
More file actions
40 lines (40 loc) · 1.1 KB
/
Partition List.cpp
File metadata and controls
40 lines (40 loc) · 1.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 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) {
if (!head) return NULL;
ListNode dh(0);
ListNode *pre = &dh;
pre->next = head;
ListNode *pvt = head;
while (pvt && pvt->val < x) pvt = pvt->next;
if (!pvt) return head;
ListNode *l = pre;
ListNode *h = pvt;
while (true) {
while (l->next != pvt && l->next->val <= x) l = l->next;
ListNode *ln = l->next == pvt ? NULL : l->next;
while (h->next != NULL && h->next->val >= x) h = h->next;
ListNode *hn = h->next;
if (!ln && !hn) break;
if (ln) {
l->next = ln->next;
ln->next = h->next;
h->next = ln;
}
if (hn) {
h->next = hn->next;
hn->next = l->next;
l->next = hn;
}
}
return pre->next;
}
};