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
.
思路:用两个ListNode一个来链接原来List中比x小的,一个用来链接原来List中比x大的。最后把两个List链接起来,删掉多余节点。
空间O(1)时间O(n)。
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
if(!head || !head->next) return head;
ListNode *big = new ListNode(1);
ListNode *small = new ListNode(-1);
ListNode *b = big;
ListNode *s = small;
ListNode *p = head;
while (head)
{
ListNode *pnext = head->next;
if(head->val >= x){
head->next = NULL;
b->next = head;
b = head;
}
else{
head->next = NULL;
s->next = head;
s = head;
}
head = pnext;
}
s->next = big->next;
head = small->next;
delete small;
delete big;
return head;
}
};
如果想保留原来List的话:
/**
* 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 *small = new ListNode(0);
ListNode *large = new ListNode(0);
ListNode *pre = head;
ListNode *ret = small;
ListNode *temp = large;
if(head==NULL)
return NULL;
while(pre!=NULL){
if(pre->val<x){
small->next = new ListNode(pre->val);
small = small->next;
}
else{
large->next = new ListNode(pre->val);
large = large->next;
}
pre=pre->next;
}
small->next = temp->next;
delete temp;
return ret->next;
}
};