【LeetCode力扣】86.分隔链表

 【LeetCode力扣】86.分隔链表_第1张图片

目录

1、题目介绍

2、解题

2.1、方法一:模拟

2.2、方法二:双指针

1、题目介绍

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

 【LeetCode力扣】86.分隔链表_第2张图片

【LeetCode力扣】86.分隔链表_第3张图片

 

输入: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;

话不多说,看图:

【LeetCode力扣】86.分隔链表_第4张图片

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

【LeetCode力扣】86.分隔链表_第5张图片

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

【LeetCode力扣】86.分隔链表_第6张图片 

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

【LeetCode力扣】86.分隔链表_第7张图片

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

【LeetCode力扣】86.分隔链表_第8张图片

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

【LeetCode力扣】86.分隔链表_第9张图片

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

【LeetCode力扣】86.分隔链表_第10张图片

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

【LeetCode力扣】86.分隔链表_第11张图片

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

【LeetCode力扣】86.分隔链表_第12张图片

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力扣】86.分隔链表_第13张图片

 

相关【LeetCode力扣】:

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

  

你可能感兴趣的:(leetcode,链表,算法,java)