【LeetCode力扣】86. 分隔链表

这篇具有很好参考价值的文章主要介绍了【LeetCode力扣】86. 分隔链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言 

目录

1、题目介绍

2、解题思路

2.1、双链表双指针

2.2、代码描述


【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

 

1、题目介绍

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

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

 示例 1:

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

输入: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、解题思路

根据题意,考虑通过「新建两个链表」实现原链表分割,算法流程为:

  1. 新建两个链表 small  BigEqu ,分别用于链接小于标志数 x 的结点和大于等于标志数 x 的结点。
  2. 遍历链表head并依次比较各节点值 head->val x 的大小,若head->val < x ,则将head指向的该结点添加到链表 small 最后面。若head->val >= x,则将head指向的该结点添加到链表BigEqu最后面。
  3. 遍历完成后,拼接 small  BigEqu 链表。
  4. 最终判断头结点并返回。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

2.1、双链表双指针

首先比较head->val与x,发现此时head->val小于x,因此放入small链表中,此时small的链头smallH和链尾smallT都指向结点1。head指向下一个结点。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

继续比较head->val与x,发现此时head->val大于x,因此放入BigEqu链表中,此时BigEqu的链头BigEquH和链尾BigEquT都指向结点4。head指向下一个结点。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

继续比较head->val与x,发现此时head->val等于x,因此放入BigEqu链表中,此时BigEqu的链尾BigEquT指向结点3。head指向下一个结点。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

继续比较head->val与x,发现此时head->va小于x,因此放入small链表中,此时small的链尾smallT指向结点2。head指向下一个结点。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

继续比较head->val与x,发现此时head->va大于x,因此放入BigEqu链表中,此时BigEqu的链尾BigEquT指向结点5。head指向下一个结点。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

继续比较head->val与x,发现此时head->va小于x,因此放入small链表中,此时small的链尾smallT指向结点2。head指向下一个结点,此时head为null,则停止循环。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

此时以smallH为链头的链表就是小于标志数 x 的结点集,以BigEqu为链头的链表就是大于等于标志数 x 的结点集,只需要将small链表的链尾smallT的next指向BigEqu链表的链头,最后返回small的 链头smallT 即可。

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

2.2、代码描述

循环的过程都比较好理解,就是最后合并链表时需要考虑特殊情况,如果没有小于标志数的结点时,此时返回的链头就不是smallH了,而是BigEqu的链头BigEquH

struct ListNode* partition(struct ListNode* head, int x){
    struct ListNode* smallH = NULL; //小于头
    struct ListNode* smallT = NULL; //小于尾
    struct ListNode* BigEquH = NULL; //大于等于头
    struct ListNode* BigEquT = NULL; //大于等于尾
    struct ListNode* next = NULL;
    //小于连一起,大于等于连一起
    while(head)
    {
        next = head->next;  //用next保存head的next,然后将head->置为空
        head->next = NULL; //确保此时的head的next置为空,不然可能会导致死循环报错
        if(head->val < x)  //小于标志数
        {
            if(smallH == NULL)   //等于NULL表示第一次放入结点,
                                    //此时链头链尾都指向同一个结点
            {
                smallH = smallT = head;  
            }
            else    //small的链尾的next指向head
            {
                smallT->next = head;
                smallT = head;
            }
        }
        else  //大于等于标志数
        {
            if(BigEquH == NULL)  //同理
            {
                BigEquH = BigEquT = head;
            }
            else
            {
                BigEquT->next = head;
                BigEquT = head;
            }
        }
        head = next;   //head指向下一个结点
    }

    //判断是否可以尾接头
    if(smallT != NULL)  //当small链尾不为空,即small链表有结点时,
                        //才让small链尾连接BigEqu链头
    {
        smallT->next = BigEquH;
    }
    
    return smallH == NULL ? BigEquH : smallH;  //当small链表没有结点时,返回链头BigEquH,
                                                //否则返回链头smallH
}

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言

更多【LeetCode刷题】 推荐:

【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)_Hacynn的博客-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/133578735【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/133785886【LeetCode力扣】297. 二叉树的序列化与反序列化-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/133827375

【LeetCode力扣】86. 分隔链表,LeetCode刷题,算法,leetcode,链表,排序算法,数据结构,c语言 

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!文章来源地址https://www.toymoban.com/news/detail-712830.html

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

到了这里,关于【LeetCode力扣】86. 分隔链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣每日一题86:分隔链表

    给你一个链表的头节点  head  和一个特定值   x  ,请你对链表进行分隔,使得所有  小于   x  的节点都出现在  大于或等于   x  的节点之前。 你应当  保留  两个分区中每个节点的初始相对位置。 示例 1: 示例 2: 提示: 链表中节点的数目在范围  [0, 200]  内 -100 = N

    2024年02月07日
    浏览(28)
  • 【leetcode 力扣刷题】移除链表元素 多种解法

    题目链接:203.移除链表元素 题目内容: 理解题意:就是单纯的删除链表中所有值等于给定的val的节点。上一篇博客中介绍了链表的基础操作,在删除链表中节点时,需要注意的是头节点: 如果没有虚拟头节点,那么对头节点的删除需要做不同的处理,head = head-next; 如果有

    2024年02月12日
    浏览(35)
  • 【leetcode 力扣刷题】链表基础知识 基础操作

    在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】是线性结构的,其中线性表包括顺序表和链表。数组就是顺序表,其各个元素在内存中是连续存储的。 链表则是由 数据域 和 指针域 组成的 结构体 构成的,数据域是一个节点的数据,指针域

    2024年02月12日
    浏览(33)
  • 【LeetCode刷题-链表】--82.删除排序链表中的重复元素II

    由于链表是排好序的,所以只需要对其进行一次遍历即可,比较相邻节点对应的值

    2024年02月06日
    浏览(32)
  • leetcode算法刷题——链表

    题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [], val = 1 输出:[] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,

    2024年02月21日
    浏览(36)
  • Leetcode刷题笔记题解(C++):83. 删除排序链表中的重复元素

    思路:链表相关的问题建议就是画图去解决,虽然理解起来很容易,但就是写代码写不出来有时候,依次去遍历第二节点如果与前一个节点相等则跳过,不相等则遍历第三个节点

    2024年02月22日
    浏览(33)
  • (链表专题) 725. 分隔链表 ——【Leetcode每日一题】

    给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长

    2023年04月17日
    浏览(29)
  • 【leetcode刷题之路】剑指Offer(4)——分治+排序算法+动态规划

    8 分治算法 8.1 【递归】剑指 Offer 07 - 重建二叉树 https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/   前序遍历是根左右,中序遍历是左根右,这也就意味着前序遍历的第一个节点是整棵树的根节点,顺着这个节点找到它在中序遍历中的位置,即为in_root,那么in_root左边的都在左子

    2024年02月11日
    浏览(43)
  • 算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

    给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 链表中节点数目在范围 [0, 300] 内 -100 = Node.val = 100 题目数据保证链表已经按升序 排列 面对这道算法题目,二当家的再次陷入了沉思。 本来要删除重复元素,需要两次遍

    2024年02月07日
    浏览(28)
  • 算法leetcode|82. 删除排序链表中的重复元素 II(rust重拳出击)

    给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 链表中节点数目在范围 [0, 300] 内 -100 = Node.val = 100 题目数据保证链表已经按升序 排列 面对这道算法题目,二当家的再次陷入了沉思。 这道题目和 83. 删除排序

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包