leetcode刷题(3)

2023-11-12

各位朋友们大家好,今天是我leedcode刷题系列的第三篇,废话不多说,直接进入主题。

分割链表

leetcode之分割链表(难度:中等)

题目要求

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

用例输入

示例 1:
在这里插入图片描述
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

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

这是题目提供的接口

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* partition(struct ListNode* head, int x){

}

提示

提示:

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

做题思路

我们可以使用一个指针来遍历链表,遇到比x值小的数字就放在左侧,大于或等于的结点就放在右侧,最后再用指针将这两个部分连接起来,得出来的就是我们需要的结果。

在这里插入图片描述
定义四个结构体指针:bs和be分别指向小于x部分链表的头和尾,as和ae分别指向大于或等于x部分链表的头和尾。
在这里插入图片描述
在这里插入图片描述
持续这个动作,知道cur等于NULL。
在这里插入图片描述
然后我们这两部分用指针连接起来。并且将ae手动置为NULL,防止链表出现死循环。
在这里插入图片描述
我们在做完了之后我们还需要注意的是:当只有小于x的值或者只有大于x的部分的时候我们上面的思路是不行的,我们需要做出判断,当bs为NULL时我们可以直接返回as,因为就算as也为NULL,返回的也是NULL。当as为NULL时,我们直接返回bs,不需要将ae置为NULL。

c语言代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* partition(struct ListNode* head, int x){
//定义四个结构体指针来管理小于和大于等于x两部分的链表
	//小于x部分的头节点
    struct ListNode* bs = NULL;
    //小于x部分的尾节点
    struct ListNode* be = NULL;
    //大于x部分的头节点
    struct ListNode* as = NULL;
    //大于x部分的尾节点
    struct ListNode* ae = NULL;
    //cur用来遍历链表
    struct ListNode* cur = head;
    while(cur != NULL)
    {
        if(cur->val < x)
        {
        //当第一次出现小于x的节点的时候,bs和be都是这个节点
            if(bs == NULL)
            {
                bs = cur;
                be = cur;
            }
            else
            {
                be->next = cur;
                be = be->next;
            }
        }
        else
        {
        //第一次出现大于x的节点
            if(as == NULL)
            {
                as = cur;
                ae = cur;
            }
            else
            {
                ae->next = cur;
                ae = ae->next;
            }
        }
        cur = cur->next;
    }
    //判断是否有小于x的节点
    if(bs == NULL)
    {
        return as;
    }
    //连接两部分链表
    be->next = as;
    //判断是否有大于x的节点
    if(as != NULL)
    {
        ae->next = NULL;
    }

    return bs;
}

在这里插入图片描述

Java代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
    //我们的Java代码与c语言略有不同,
    //我们将bs和as作为哨兵位
        if(head == null) {
            return null;
        }
        ListNode bs = new ListNode(0);
        ListNode be = bs;
        ListNode as = new ListNode(0);
        ListNode ae = as;
        ListNode cur = head;
        while(cur != null) {
            if(cur.val < x) {
                be.next = cur;
                be = be.next;
            }else {
                ae.next = cur;
                ae = ae.next;
            }
            cur = cur.next;
        }
        if(bs.next == null) {
            return as.next;
        }
        be.next = as.next;
        if(as.next != null) {
            ae.next = null;
        }

        return bs.next;
    }
}

在这里插入图片描述

相交链表

leetcode之相交链表(难度:简单)

题目要求

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

用例输入

示例 1:
在这里插入图片描述

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3

输出:Intersected at ‘8’

解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例 2:
在这里插入图片描述

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1

输出:Intersected at ‘2’

解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:
在这里插入图片描述

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2

输出:null

解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

题目提供的接口

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

}

提示

提示:

listA 中节点数目为 m
listB 中节点数目为 n
1 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 没有交点,intersectVal 为 0
如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

做题思路

当这两个链表从后面剩余的节点的个数相同的地方开始走,他们会在相交节点相遇。但是因为两个链表的长度不一定是相同的,所以我们需要求出两个链表的长度的差值len,然后让长的链表先走len步,然后再一起走,当他们的地址相同时就说明到达了相交节点,我们就返回这个节点。

c语言实现代码

//我们将计算链表长度这个功能单独提出来,写成一个函数
int listLength(struct ListNode* head)
{
    struct ListNode* cur = head;
    int count = 0;
    while (cur != NULL)
    {
        count++;
        cur = cur->next;
    }
    return count;
}

struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
//当其中一个链表为空就说明没有相交节点,我们直接返回
    if (headA == NULL || headB == NULL)
    {
        return NULL;
    }
    //我们将ll作为长度较长的链表的指针
    struct ListNode* ll = headA;
    //sl作为长度较短的链表的指针
    struct ListNode* sl = headB;
    int lenA = listLength(headA);
    int lenB = listLength(headB);
    int len = lenA - lenB;
    //如果len<0,我们就交换ll跟sl的指向
    if (len < 0)
    {
        ll = headB;
        sl = headA;
        len = -len;
    }
    for (int i = 0; i < len; i++)
    {
        ll = ll->next;
    }
    while (ll && sl)
    {
        if (ll == sl)
        {
            return ll;
        }
        ll = ll->next;
        sl = sl->next;
    }
    return NULL;
}

在这里插入图片描述

Java代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

 //链表长的就走差值步
 //pl永远指向较长的链表
 //p2永远指向较短的链表
public class Solution {
    public int getLength(ListNode head) {
        int count = 0;
        ListNode cur = head;
        while(head != null) {
            head = head.next;
            count++;
        }
        return count;
    }
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null) {
            return null;
        }
        ListNode pl = headA;
        ListNode ps = headB;
        int len1 = getLength(pl);
        int len2 = getLength(ps);
        int len = len1-len2;
        if(len < 0) {
            pl = headB;
            ps = headA;
            len = -len;
        }
        while(len != 0) {
            pl = pl.next;
            len--;
        }
        while(pl != ps) {
            pl = pl.next;
            ps = ps.next;
        }

        return pl;
    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode刷题(3) 的相关文章

  • ARM第五章平时作业

    第 5 章 S3C2440 嵌入式系统 共 63 分 一 简述启动代码存储在 NAND Flash 存储器上时 S3C2440 的启动过程 6 分 为了支持 NAND Flash 的 boot loader S3C2440A 配备了一个内部
  • java环境变量配置详细教程

    1 什么是环境变量 环境变量 environment variables 一般是指在操作系统中用来指定操作系统运行环境的一些参数 如 临时文件夹位置和系统文件夹位置等 环境变量是在操作系统中一个具有特定名字的对象 它包含了一个或者多个应用程
  • Java 访问权限 内部类总结

    在Java中 可以将一个类定义在另一个类里面或者一个方法里边 这样的类称为内部类 广泛意义上的内部类一般包括四种 成员内部类 局部内部类 匿名内部类 静态内部类 1 成员内部类 1 该类像是外部类的一个成员 可以无条件的访问外部类的所有成员
  • Java桥接模式

    基本介绍 1 桥接模式 Bridge模式 是指 将实现与抽象放在两个不同的类层次中 使两个层次可以独立改变 2 是一种结构型设计模式 3 Bridge模式基于类的最小设计原则 通过使用封装 聚合及继承等行为让不同的类承担不同的职责 它主要特
  • vue2 维护状态key的作⽤和原理

    1 key定义 为了给 Vue 个提示 以便它能跟踪每个节点的身份 从 重 和重新排序现有元素 你需要为每项提供 个唯 key 2 写法 li item name li 3 作 key 值使 数组的索引index 或者不加 在数组元素顺序打
  • 2023最新版本Activiti7系列-源码篇-初始化过程

    源码分析 1 设计模式 1 1 命令模式 https dpb bobokaoya sm blog csdn net article details 89115420 1 2 责任链模式 https dpb bobokaoya sm blog
  • xss攻击的了解

    常见的xss攻击方法 1 绕过XSS Filter 利用 lt gt 标签注入Html JavaScript代码 2 利用HTML标签的属性值进行xss攻击 例如 img src 当然并不是所有的Web浏览器都支持Javascript伪协议

随机推荐

  • 【LeetCode刷题】203 移除链表元素 java

    题目 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node val val 的节点 并返回 新的头节点 示例 方法一 先对头节点做处理 使其不为val class Solution public ListNo
  • java一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。(java50道经典编程题)

    题目 一个数如果恰好等于它的因子之和 这个数就称为 完数 例如6 1 2 3 编程 找出1000以内的所有完数 对于这道题其实乍一看可能觉得比较困难 但是你只要 知道一个问题作为求因子 只需要从1开始让你输入的这个数一直除就好了 记得每回合
  • C++对于表达式临时对象的处理

    在表达式中如果使用了一个类的操作符重载函数 或者调用了一个返回类对象的函数 都会产生临时对象 临时对象的生存周期就在表达式中 甚至是表达式中的子语句 临时对象的销毁应该是在完整表达式的最后一句执行 比如下面的例子 T c c a b 另外
  • Remove Duplicates from Sorted Array II

    还是原地重写法 保留的条件是A j A i 2 注意后面的下标是i 2 不是j 2 int removeDuplicates int A int n if n lt 3 return n int i 2 for int j 2 j
  • java关于文件记录篇章之文件夹创建篇

    今天 创建一个文件夹目录的时候 创建多级目录的时候发现 自己老是创建失败 但是系统显示文件夹创建成功 但是你去找文件夹的时候 又发现创建失败 这里在我成功之后封装了一个创建文件夹的创建对象 首先这个文件夹是用来解决本地存储文件和linux上
  • dockers报错:Cannot connect to the Docker daemon

    异常信息 22 01 14 13 58 44 Reporter INFO YarnAllocator Completed container container e118 5690061100801 24379300 01 000066 o
  • 更换gradle,引起文件缺失报错 Could not resolve all dependencies for configuration ':classpath'.

    因为公司项目需要低版本gradle 加上同事其他项目也是需要低版本gradle 要更换gradle 使用2 14 1 于是遇到了如下报错 百度了 很多人都没有直接的办法 直接放弃去找已经下载的使用 看了一篇文章https www cnblo
  • 【Web3.0大势所趋】下一代互联网的未来

    前言 Web3 0 是一个越来越受到关注的话题 它被认为将会带来天翻地覆的变化 本文我们一起来谈谈 Web3 0 的概念 特点和优势 并探讨它为什么如此重要和具有革命性的 文章目录 前言 Web3 0是什么 区块链技术 智能合约 总结 We
  • elasticsearch之explain的使用

    explain查看怎么计算得分的 format将json格式结果转为yaml展示 POST tlsmz search format yaml explain true query bool must term fz keyword valu
  • phpstorm显示页面不停的在indexing转圈中,并且文件名还一直在刷新

    打开 File下的 Invalidate Caches Restart 下的 Invalidate and Restart 便可以了
  • 区块链学习笔记16——以太坊中的交易树和收据树

    十六 以太坊中的交易树和收据树 每次发布一个交易的时候 那些交易会组织成一个交易树 也是一颗Merkle tree跟比特币中的情况是类似的 同时以太坊还增加了一个收据树 每个交易执行完之后会形成一个收据 记录这个交易的相关信息 交易树和收据
  • Latex公式排版(编号、换行、括号内换行、对齐)

    最近写论文刚上手了Latex 因为有模板 所以用起来还是很方便的 但是在实际使用中 由于论文是双栏的 因此比较长的公式在排版时会比较困难 下面对Latex中的公式排版方法做一些记录 公式的编写方法在此不再赘述 可以选择网页版的Latex公式
  • 机器学习项目

    文章来源 ATYUN AI平台 8800个开源机器学习项目 并从中选取了前30个制成这份清单 它涵盖了2017年1月和12月之间发布的最佳开源机器学习库 数据集和应用程序 Mybridge AI通过受欢迎程度 参与度和新近度来评估质量 为了
  • 安卓开发移植他人项目 配置问题

    在开发移植他人项目会出现各种配置问题 解决方法 1 将build gradle中的包版本改成跟自己本地项目相同的版本 2 在gradle properties中写入 android overridePathCheck true 3 在app
  • 离线包实现app内H5的秒开

    前言 市面上业务复杂 App中近半数业务页面使用H5 页面承载 H5的优势很明显 跨平台 迭代快 开发体验好 H5的劣势同样明显 加载慢 用户体验差 为了提高页面加载速度和成功率 我们在app H5 部分业务加载 采用了离线包方式 如果有业
  • 如何选取合适的运算放大器?

    首先呢 我不是大牛 本文也会有很多不足之处 欢迎大家提出意见 进入正题 在模拟输入部分 一个重要的大类是单端电压和电流的调理和转换 如 0 5V 10V 0 20mA 等 另一个重要的大类是传感器信号的调理和转换 最常用的如电桥 R TD
  • 2021哈工大深入理解计算机系统Lab5(linklab)

    2021哈工大计算机系统lab5 linklab 实验目的 实验环境与工具 硬件环境 软件环境 开发工具 实验内容 LinkBomb程序框架 phase1 全局变量 数据节 phase2 指令 代码节 phase3 符号解析 phase4
  • Python 各种数据保存与读取方法——numpy,dict,dataframe等等

    文章目录 前言 一 写入与读取 1 Dataframe转csv xlsx 2 numpy ndarray转npy 3 dict转txt 总结 前言 往往在做机器学习或者深度学习的时候 数据预处理部分需要大量的时间 如果每次debug都重新预
  • shiro SecurityManager简介说明

    转自 shiro SecurityManager简介说明 下文笔者讲述Shiro SecurityManager的相关简介说明 如下所示 SecurityManager是Shiro框架的核心 典型的Facade模式 Shiro通过Secur
  • leetcode刷题(3)

    各位朋友们大家好 今天是我leedcode刷题系列的第三篇 废话不多说 直接进入主题 文章目录 分割链表 题目要求 用例输入 提示 做题思路 c语言代码实现 Java代码实现 相交链表 题目要求 用例输入 提示 做题思路 c语言实现代码 J