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.
Example:
Input: head = 1->4->3->2->5->2, x = 3 Output: 1->2->2->4->3->5
思路:
两种方案:1 冒泡法;2 替换法
1 冒泡法
当出现前一个大于目标数后一个小于目标数时进行替换,理论时间上线O(n^2),代码如下:
ListNode* partition(ListNode* head, int x) {
bool notSort = true;
while (notSort){
notSort = false;
int findEnd = 0, trueEnd = 0;
ListNode *curr = head;
while (curr){
if (curr && curr->next && curr->val >= x && curr->next->val < x){
int temp = curr->val;
curr->val = curr->next->val;
curr->next->val = temp;
notSort = true;
}
curr = curr->next;
}
}
return head;
}
2 替换法
我们记录下第一个大于目标的数,当后面有小于目标的数时就进行替换操作,理论时间上限O(n),代码如下:
ListNode* partition2(ListNode* head, int x){
ListNode feakHead(0); feakHead.next = head; head = &feakHead;
ListNode *bigPos = NULL, *curr = head;
while (curr && curr->next){
if (curr->next->val >= x && !bigPos){
bigPos = curr;
}
else if (curr->next->val < x && bigPos){
ListNode *bigNext = bigPos->next;
bigPos->next = new ListNode(curr->next->val);
curr->next = curr->next->next;
bigPos->next->next = bigNext;
bigPos = bigPos->next;
}
curr = curr->next;
}
return head->next;
}
最后贴出两种实现运行时间,竟然一样: