标签:
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
.
/** * 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==NULL||head->next==NULL)return head; ListNode *newhead=new ListNode(INT_MIN); ListNode *p=newhead; p->next=head; head=p; ListNode *tmp=head; ListNode *min2; ListNode *max1; ListNode *max2; while (tmp!=NULL&&tmp->val<x) { min2=tmp; tmp=tmp->next; } if (tmp!=NULL&&tmp->val>=x) { max1=tmp; max2=tmp; tmp=tmp->next; } while(tmp!=NULL) { if (tmp->val>=x) { max2=tmp; tmp=tmp->next; } else { ListNode *ptmp=tmp->next; max2->next=tmp->next; min2->next=tmp; tmp->next=max1; min2=min2->next; tmp=ptmp; } } return newhead->next; } /* ListNode *partition(ListNode *head, int x) { if(head==NULL||head->next==NULL)return head; ListNode *left=new ListNode(0); ListNode *pleft=left; ListNode *right=new ListNode(0); ListNode *pright=right; ListNode *tmp=head; while(tmp!=NULL) { if(tmp->val<x) { pleft->next=tmp; pleft=pleft->next; } else { pright->next=tmp; pright=pright->next; } tmp=tmp->next; } pright->next=NULL; pleft->next=right->next; return left->next; } */ };
标签:
原文地址:http://www.cnblogs.com/Vae98Scilence/p/4281408.html