分隔链表(中等)
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
struct ListNode
{
int val;
ListNode *next;
ListNode(int x): val(x), next(nullptr) {}
};
class Solution
{
public:
ListNode* partition(ListNode *head, int x)
{
if(!head) return nullptr;
ListNode *smaller_head = new ListNode(-2);
ListNode *smaller = smaller_head;
ListNode *larger_head = new ListNode(-1);
ListNode *larger = larger_head;
while(head)
{
if(head->val < x)
{
smaller->next = head;
smaller = smaller->next;
}
else
{
larger->next = head;
larger = larger->next;
}
head = head->next;
}
larger->next = nullptr;
smaller->next = larger_head->next;
ListNode *ret = smaller_head->next;
delete larger_head;
delete smaller_head;
return ret;
}
};