题目: 给你一个链表的头节点 `head` 和一个特定值 `x` ,请你对链表进行分隔,使得所有 小于 `x` 的节点都出现在 大于或等于 `x` 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
算法: 我们只需维护两个链表 small和 large 即可,small 链表按顺序存储所有小于 x 的节点,large 链表按顺序存储所有大于等于 x 的节点。遍历完原链表后,我们只要将 small 链表尾节点指向 large 链表的头节点即能完成对链表的分隔。
//时间复杂度O(n)
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* Smallhead=new ListNode(-1);//samll链表的虚拟/哨兵头节点
auto small=Smallhead;
ListNode* Largehead=new ListNode(-1);//large链表的虚拟头结点
auto large=Largehead;
for(auto p=head;p;p=p->next)
{
if(p->val < x)
{
small->next=p;
small=small->next;
}
else
{
large->next=p;
large=large->next;
}
}
large->next=nullptr;//因为large指针指向分割链表的后半段,需要给末尾添加nullptr,samll和large串联之后,即新链表结尾为nullptr
small->next=Largehead->next;//将small链表和large链表串联
return Smallhead->next;
}
};