给定一个链表和一个值x,对它进行分区,使得小于x的所有节点都在大于或等于x的节点之前.保留两个分区中的每一个节点的原始相对顺序。

这是一个关于LeetCode的问题,目标是对链表进行分区,使得所有小于给定值x的节点都在大于或等于x的节点之前,同时保持原始相对顺序。解决方案包括找到第一个大于或等于x的节点p,然后将后续小于x的节点插入到p之前,或者分别创建两个链表分别存储小于和大于等于x的节点,最后合并链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题源自LeetCode

------------------------------------------------------------

例如:

Given1->4->3->2->5->2and x = 3,
return1->2->2->4->3->5.

思路:先找到第一个大于或者等于给定值的节点p,然后将之后小于给定值的节点按顺序插入到p前面。 

代码 :

    ListNode *partition(ListNode *head, int x) {
        ListNode* root=new ListNode(0);
        ListNode* pre=root;     //指向第一个大于或者等于x的节点前一个节点
        ListNode* p=head;
        root->next=head;
        while(p&&p->val<x){
            pre=p;
            p=p->next;
        }
        ListNode* q=pre;      //保持链表不断
        while(p){
            if(p->val<x){
                q->next=p->next;     //保证链表不断,将p 插入到pre的后面
                p->next=pre->next;
                pre->next=p;
                pre=p;
                p=q;
            }
            q=p;
            p=p->next;
        }
        return root->next;
    }


思路2:

新建俩个链表,一个存放小于x的节点,另一个存放大于等于x的节点。最后将链表和在一起。就得到结果

代码:

    ListNode *partition(ListNode *head, int x) {
        ListNode* root1=new ListNode(0);
        ListNode* q1=root1;
        ListNode* root2=new ListNode(0);
        ListNode*q2=root2;
        ListNode* p=head;
        while(p){
            if(p->val<x){
                q1->next=p;
                q1=q1->next;
            }else{
                q2->next=p;
                q2=q2->next;
            }
            p=p->next;
        }
        q2->next=NULL;  //如果链表的最后一个元素小于X则q2的最后一个元素不为空,必须置空
        q1->next=root2->next;
        return root1->next;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值