【LeetCode力扣】86.分隔链表

 

目录

1、题目介绍

2、解题

2.1、方法一:模拟

2.2、方法二:双指针

1、题目介绍

原题链接:86. 分隔链表 - 力扣(LeetCode)

 

 

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200] 内
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

2、解题方法:模拟

简单来说我们可以先用两个链表 small 和 large 来分别存放所有小于x的节点和大于x的节点,small 链表按顺序存储所有小于 x 的节点,large 链表按顺序存储所有大于等于 x 的节点。

在遍历完原链表后,只要将 small 链表尾节点指向 large 链表的头节点即能完成对链表的分隔。

为了实现这一想法,还需要用到两个指针smallH和largeH来分别指向small链表和large链表的第一个节点。

具体规则:

1.当head->val小于x时,把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点;   即执行 small->next = head;  small = small->next;  head = head->next;

2.head->val大于或者等于x,把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点;   即执行 large->next = head;  large = large->next;  head = head->next;

最后把largeH(注意这里是largeH,不是large)当前指向节点的下一个节点加到small(注意这里是small,不是smallH)当前指向节点的下一个节点,把两个链表链接起来,然后返回smallH(注意这里是smallH,不是small)当前指向节点的下一个节点;即执行 small->next = largeH->next;  return smallH->next;

话不多说,看图:

 先创建small链表和large链表,然后把smallH和largeH两个指针分别指向small链表和large链表的第一个节点。

这时候的head->val等于1;head->val小于x,所以把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head;  small = small->next;  head = head->next;

 

这时候的head->val等于4;head->val大于x,所以把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head;  large = large->next;  head = head->next;

这时候的head->val等于3;head->val等于x,所以把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head;  large = large->next;  head = head->next;

这时候的head->val等于2;head->val小于x,所以把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head;  small = small->next;  head = head->next; 

这时候的head->val等于5;head->val大于x,所以把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head;  large = large->next;  head = head->next;

这时候的head->val等于2;head->val小于x,所以把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head;  small = small->next;  head = head->next; 

这时候head等于NULL了,所以结束循环;然后把largeH(注意这里是largeH,不是large)当前指向节点的下一个节点加到small(注意这里是small,不是smallH)当前指向节点的下一个节点,把两个链表链接起来,然后返回smallH(注意这里是smallH,不是small)当前指向节点的下一个节点;即执行 small->next = largeH->next;  return smallH->next;

3、解题代码

因为我们不知道head链表有多少给节点,所以在创建small链表和large链表两个链表时要借助C语言里的malloc()函数。malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。

struct ListNode* partition(struct ListNode* head, int x){
   struct ListNode* small = malloc(sizeof(struct ListNode));
    struct ListNode* large = malloc(sizeof(struct ListNode));
    struct ListNode* smallH = small;
    struct ListNode* largeH = large;
    //当head不为空时就执行循环语句,head为空时就结束循环
    while(head != NULL){
        if(head->val < x){
            small->next = head;
            small = small->next;
        } else{
            large->next = head;
            large = large->next;
        }
        head = head->next;
    }
    large->next = NULL;
    small->next = largeH->next;
    return smallH->next;
}

 

相关【LeetCode力扣】:

【LeetCode力扣】75.颜色分类———快速排序子过程(荷兰国旗问题)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/133870075?spm=1001.2014.3001.5502

  

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值