设置两个标记指针。前边的指针不断向前,每当碰到比x小的数则接到后边标记指针上,并且后面的指针前进一位指向新接到后边的元素。直到前边的指针完成遍历,则比x小的数都按原有顺序接到后边指针上。
时间复杂度:O(N)
C++代码:
class Solution{
public:
ListNode * partition(ListNode* head, int x) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode n(INT_MIN);
n.next = head;
head = &n;
ListNode* p1 = head, *p2 = head;
while (p1->next != nullptr && p2->next != nullptr)
{
if (p1->next->val < x)
{
p1 = p1->next;
p2 = p2->next;
}
else
{
while (p2->next != nullptr && p2->next->val>=x)
{
p2 = p2->next;
}
if (p2->next == nullptr)
break;
else
{
ListNode* temp = p2->next;
p2->next = p2->next->next;
temp->next = p1->next;
p1->next = temp;
p1 = p1->next;
}
}
}
return head->next;
}
};