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
.
类似于qsort的partition的思想,用两根指针记录左右两边。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *partition(ListNode *head, int x) { 12 // Start typing your C/C++ solution below 13 // DO NOT write int main() function 14 if (head == NULL) 15 return NULL; 16 17 ListNode *pPre = NULL; 18 ListNode *p = head; 19 ListNode *q = head; 20 21 while(q->next) 22 q = q->next; 23 24 ListNode *tail = q; 25 26 while(p != q) 27 { 28 if (p->val >= x) 29 { 30 ListNode *pNext = p->next; 31 if (head == p) 32 head = pNext; 33 tail->next = p; 34 p->next = NULL; 35 tail = p; 36 if (pPre) 37 pPre->next = pNext; 38 p = pNext; 39 } 40 else 41 { 42 pPre = p; 43 p = p->next; 44 } 45 } 46 47 if (p->val >= x && q != tail) 48 { 49 ListNode *pNext = p->next; 50 if (head == p) 51 head = pNext; 52 tail->next = p; 53 p->next = NULL; 54 if (pPre) 55 pPre->next = pNext; 56 } 57 58 return head; 59 } 60 };