题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
题解思路:
方法:双指针就行分割
遍历链表,把小于x的链表L1进行串起来,大于x的链表L2串起来,最后L1的下一个结点就是L2的头结点。
推荐函数代码一:
class Solution {
public:
void reorderList(ListNode* head) {
if(!head||!head->next)
{
return;
}
ListNode *fast=head;
ListNode *slow=head;
while(fast->next&&fast->next->next)
{
fast=fast->next->next;
slow=slow->next;
}
fast=slow->next;
slow->next=NULL;
ListNode *pre=NULL;
while(fast)
{
ListNode *n=fast->next;
fast->next=pre;
pre=fast;
fast=n;
}
slow=head;
fast=pre;
while(slow)
{
if(fast)
{
ListNode *n=slow->next;
slow->next=fast;
ListNode *nn=fast->next;
fast->next=n;
slow=n;
fast=nn;
}
else
{
break;
}
}
}
};
函数代码二:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *dummy1=new ListNode(0);
ListNode *dummy2=new ListNode(0);
ListNode *p1=dummy1;
ListNode *p2=dummy2;
p1->next=head;
p2->next=head;
ListNode *p=head;
while(p)
{
if(p->val<x)
{
p1->next=p;
p1=p1->next;
}
else
{
p2->next=p;
p2=p2->next;
}
p=p->next;
}
p2->next=NULL;
p1->next=dummy2->next;
return dummy1->next;
}
};