首页 > 其他分享 >【力扣】分隔链表

【力扣】分隔链表

时间:2024-02-27 14:44:18浏览次数:29  
标签:力扣 head slow ListNode Dummy fast next 链表 分隔

题目描述

image

思路

先想到的一个方法是快慢指针扫描小于x的结点,然后把这些节点插入到慢指针后面去,但是写着写着好像发现这个题也可以用递归来写,后面的若干个结点的子表和整个问题的性质是一样的。
普通方法的代码如下:

//只是大致是这样,这个代码还有一些用例跑不过
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if(head == nullptr ){
            return head;
        }
        if(head -> next == nullptr && head -> val < x){
            return head;
        }
        ListNode* Dummy = new ListNode(0,head);
        ListNode* slow = Dummy;
        ListNode* fast = Dummy;

        if(head -> val < x){
            slow = head ;
            fast = slow;
        }else{
            slow = Dummy;
            fast = Dummy;
        }
        while(slow != nullptr && fast-> next != nullptr){
            if(fast-> next->  val < x ){
                ListNode* tmp = fast -> next;
                fast -> next = tmp -> next;
                tmp -> next = slow -> next;
                slow -> next = tmp;
                slow = tmp;
                continue;
            }
            fast = fast -> next;
        }
        return Dummy -> next;
    }
};

递归算法的代码如下:

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        //基本问题
        if(head == nullptr || head -> next == nullptr){
            return head;
        }
        ListNode* Dummy = new ListNode(0, head);
        ListNode* cur;
        head-> next = partition(head -> next, x);
        if(head-> val >= x){
            Dummy-> next = head -> next;
            cur = Dummy;
            while(cur -> next != nullptr && cur -> next -> val < x){
                cur = cur -> next;
            }
            head -> next = cur -> next;
            cur ->next = head;
            return Dummy-> next;
        }
        return head;
    }
};

一眼就可以看出递归算法的优势,逻辑简单,可读性强,不易出错。

标签:力扣,head,slow,ListNode,Dummy,fast,next,链表,分隔
From: https://www.cnblogs.com/satsuki26681534/p/18036848

相关文章

  • 代码随想录 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.0
    LeetCode:24.两两交换链表中的节点-力扣(LeetCode)思路:第一步:两两交换要考虑循环什么时候退出,当cur指针.next是null是就到尾部了,同理,链表不是奇数就是偶数,cur.next.next是空也是。第二步循环条件判断完了接下来要实现交换,如图所示,按步骤来就好,提前将1,2,3存好,接下来按图......
  • linux内核链表 --20240225
    提起linux内核链表,首先一定得弄清楚的两个linux内核常用宏offsetof&&container_ofoffsetof宏#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)宏解析:1、size_t在系统中一般指unsignedint,无符号整型2、(TYPE*)0,把0地址强制转换成type结构体类型的指针......
  • 【力扣】删除排序链表中的重复元素II
    题目描述思路这些链表的有序性使这些操作都不难写。前面在数组的题目里写过跳过重复元素的算法,这个和那个类似,用快慢指针写,但是由于这个是删除重复元素,所以我用了两个相邻的慢指针,左边的慢指针其实是为了保存真正的慢指针的上一个位置。代码如下:classSolution{public:......
  • 【力扣】旋转链表
    题目描述思路首先用双指针法向后移动,分别获取链表的最后一个结点和倒数第k的结点,再把这部分连接到链表的头部即可,这部分的操作并不难。但是实际这样写了之后就会发现,如果链表的长度小于k的话,这样的操作就是行不通的,需要对这种情况进行特殊处理。但是在处理过程中发现这个操作......
  • 【力扣刷题】合并两个有序链表
    题目描述分析这道题实际的解法是要通过递归来写,由于链表的特性:链表的任何一个子表都是链表。所以很多链表的算法用递归来写会非常简便。这里先尝试着写一下非递归的算法,再写一遍递归的算法。非递归:classSolution{public://voidInsert(ListNode*node1,ListNode*n......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 链表
    链表特性通过每个结点记录之后或之前结点的值,那么就可以知道所有结点的排列顺序。插入如果要在链表中插入一个元素。那么就可以将前面的元素的后缀(指的是之后结点的值)改成插入的元素,插入元素的后缀顶上前面元素的后缀。voidinsret(intx,inty){ nxet[y]=next[x]; next[......
  • 力扣递归之 236. 二叉树的最近公共祖先
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例1:输入:root=[3,5,1,6,2,0,8,null,n......
  • 力扣 dfs之 437. 路径总和 III
    给定一个二叉树的根节点root ,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例1:输入:root=[10,5,-3,3,2,null,11,3,-2,null,1],target......
  • 2024-02-19-物联网C语言(9-链表)
    9.链表9.1概念假如:做一个班级信息管理系统,统计班级学生的信息而我们事先不知道班级人数,或者知道人数,但是中间人员可能发生变化:比如有新同学加入,有同学请假,又或者我们需要统计班级的平均成绩等等目标:要做一个类似QQ、飞秋类似的通信软件,其中有一个功能,类似用户上下线检测、......