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
.
class Solution { public: ListNode *partition(ListNode *head, int x) { // Note: The Solution object is instantiated only once and is reused by each test case. if(head==NULL)return NULL; if(head->next==NULL)return head; ListNode* temp=NULL; ListNode* ptr=head; while(ptr!=NULL&&ptr->val>=x){ temp=ptr; ptr=ptr->next; } ListNode* ret; if(ptr==NULL){ return head; } else if(ptr==head){ //do nothing ret=head; } else{ if(temp!=NULL){ temp->next=ptr->next; } ptr->next=head; ret=ptr; } ListNode* ptr2=ret; while(ptr2->next!=NULL&&ptr2->next->val<x){ ptr2=ptr2->next; //point to insert } ptr=ptr2; while(ptr->next!=NULL){ if(ptr->next->val<x){ temp=ptr->next; ptr->next=temp->next; temp->next=ptr2->next; ptr2->next=temp; ptr2=ptr2->next; } else{ ptr=ptr->next; } } return ret; } };