题目
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
思路
看到题目第一时间想着排序解决,结果想当然是错了,题目是让我们对链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前,前提是小的在x左边,大的在x右边,当然还有一个限制条件你应当 保留 两个分区中每个节点的初始相对位置。这个条件的意思是每个元素的起始相对位置尽量不变,比如说2,1,2,3,其中x = 3,则满足条件,我们只需要左边小于x,右边大于等于x即可,起始位置尽量不变
所以定义两个链表,一个保存小于x的值,一个保存大于等于x的值,最后将两个链表连接起来就可以了
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
struct ListNode* partition(struct ListNode* head, int x)
*struct ListNode* partition:对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
struct ListNode* head:链表头结点
int x:特定值
返回值:分隔好的链表
*/
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode * l = malloc(sizeof(struct ListNode));//小于x的链表
struct ListNode * lNode = l;
struct ListNode * k = malloc(sizeof(struct ListNode));//大于等于x的链表
struct ListNode * kNode = k;
while(head)
{
if(head->val < x)//保存小于x的值
{
l->next = head;
l = l->next;
}
else//保存大于等于x的值
{
k->next = head;
k = k->next;
}
head = head->next;
}
k->next = NULL;
l->next = kNode->next;//连接并返回
return lNode->next;
}
时间空间复杂度