题目链接:链表分割_牛客题霸_牛客网
本题目在牛客网难度为较难,但是在整理思路画图后,题目难度并不大,下面说说我的思路
假设我们这里有一个链表为:2,3,5,1,7,2,然后找比4小的数字放在前面,比4大的数字放在后面,并且不改变原来的顺序,所以得出结果为:2,3,1,2,5,7
上来我们的链表应该是这样:
然后我们定义带哨兵卫的2个节点(用来保存小于4的节点和大于4的节点)
最后把2个链表连接起来(记住bigTail要置空并且smallTail->next指向为bigHead的下一个)
代码如下:
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
struct ListNode* cur=pHead;
//保存小于x的值
struct ListNode* smallHead=(struct ListNode*)malloc(sizeof(struct ListNode));
smallHead->next=NULL;
struct ListNode* smallTail=smallHead;
//保存大于x的值
struct ListNode* bigHead=(struct ListNode*)malloc(sizeof(struct ListNode));
bigHead->next=NULL;
struct ListNode* bigTail=bigHead;
while(cur)
{
if(cur->val<x)
{
smallTail->next=cur;
smallTail=smallTail->next;
}
else
{
bigTail->next=cur;
bigTail=bigTail->next;
}
cur=cur->next;
}
//这里置空不能忘记,一开始我就没想到
bigTail->next=NULL;
smallTail->next=bigHead->next;
free(bigHead);
struct ListNode* copysmallHead=smallHead->next;
free(smallHead);
return copysmallHead;
}
};