leedcode刷题(3)

news/2024/5/18 20:43:26/文章来源:https://blog.csdn.net/m0_73888323/article/details/130068316

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

文章目录

  • 分割链表
    • 题目要求
    • 用例输入
    • 提示
    • 做题思路
    • c语言代码实现
    • Java代码实现
  • 相交链表
    • 题目要求
    • 用例输入
    • 提示
    • 做题思路
    • c语言实现代码
    • Java代码实现

分割链表

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

题目要求

给你一个链表的头节点 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;}
}

在这里插入图片描述

相交链表

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

题目要求

给你两个单链表的头节点 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-1步,然后再一起走,当他们的地址相同时就说明到达了相交节点,我们就返回这个节点。

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;}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_284814.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《 LeetCode 热题 HOT 100》——无重复字符的最长子串

本期给大家带来的是 LeetCode 热题 HOT 100 第三题关于 无重复字符的最长子串 的讲解。首先&#xff0c;我们还是先从题目入手进行分析思考&#xff01;&#xff01;&#xff01; 题目如下 &#xff1a;&#x1f447; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符…

改进蚁狮优化算法

目录 ​1 主要内容 2 部分程序 3 程序结果 4 程序链接 ​1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型&#xff0c;即原始ALO算法的基础上添加了两种改进策略&#xff1a; - 改进1&#xff1a;将原先的间断性边界收缩因子变为连…

【Android开发经验】-- 如何实现RecyclerView子项的点击事件?

目录 实例 实现思路 实现代码 进一步需求&#xff1a;数据库存储 实例 假设现在需要完成一个以下需求的任务&#xff0c;下面两个图左边是点击前未完成&#xff0c;右边是点击后已完成&#xff0c;如何实现点击图标切换另一个图标&#xff1f;&#xff08;矩形框中的内容是…

医药产品经理渠道资源获取的方法有哪些?

收集渠道信息是医药产品经理非常重要的工作之一&#xff0c;以下是一些可行的方法&#xff1a; 与销售人员和客户服务团队交流 销售人员和客户服务团队是企业与患者、医生和医院进行联系的主要渠道。他们可以提供很多有关市场需求和竞争对手情况的信息。产品经理可以通过与销…

机械臂动力学参数辨识学习笔记

1、为什么需要动力学参数辨识&#xff1f; 图1 电机三环控制图 通常情况下&#xff0c;标准的工业控制器通过机械臂内部的PID进行调节控制机械臂的运动&#xff0c;即用PID输出力矩&#xff0c;涉及到经典的图一所示的电机三环控制&#xff08;位置环、速度环、电流环&#xff…

用机器学习sklearn+opencv-python过古诗文网4位数字+字母混合验证码

目录 获取验证码图片 用opencv-python处理图片 制作训练数据集 训练模型 识别验证码 编写古诗文网的登录爬虫代码 总结与提高 源码下载 在本节我们将使用sklearn和opencv-python这两个库过掉古诗文网的4位数字字母混合验证码&#xff0c;验证码风格如下所示。 验证码获…

DM的学习心得和知识总结(三)|DM数据库DBMS_WORKLOAD_REPOSITORY 包及其性能分析工具AWR

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、达梦数据库产品及解决方案&#xff0c;点击前往 2、达梦技术文档&#xff0c;点击前往 3、武汉达梦数据库有限公司 官网首页&#xff0c;点击前往 1、本文内容全部…

【软考备战·希赛网每日一练】2023年4月10日

文章目录一、今日成绩二、错题总结第一题第二题三、知识查缺题目及解析来源&#xff1a;2023年04月10日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 本题属于专业英语&#xff0c;大体了解意思即可。 题目大意&#xff1a; 第二题 解析&#xff1a…

ORACLE创建表空间、用户、授权和Navicat创建序列和触发器及解决ORA-00942、ORA-01219错误

问题描述&#xff1a;因为每次Oracle删除数据库的时候磁盘文件还没删除&#xff0c;然后自己手动停止Oracle&#xff0c;删除磁盘里的.DBF文件导致数据库重启后无法连接。 cmd sqlplus sys as sysdba执行alter database open;查看你报错的数据文件&#xff08;就是你停止Orac…

ESP32 分区表

ESP32 分区表 1. 分区表概述 ESP32 针对 flash 进行划分&#xff0c;划分为不同的区域用作不同的功能&#xff0c;并在flash的 0x8000 位置处烧写了一张分区表用来描述分区信息。 分区表可以根据自己的需要进行配置&#xff0c;每一个分区都有其特定的作用&#xff0c;可根据…

Jetpack Compose之选择器

选择器是啥 选择器主要是指Checkbox复选框&#xff0c;单选开关Switch,滑杆组件Slider等用于提供给用户选择一些值和程序交互的组件&#xff0c;比如像复选框Checkbox&#xff0c;可以让用户选择一个或者多个选项&#xff0c;它可以将一个选项打开或者是关闭&#xff0c;通常用…

【JavaEE】ConcurrentHashMap与Hashtable有什么区别?

博主简介&#xff1a;努力的打工人一枚博主主页&#xff1a;xyk:所属专栏: JavaEE初阶Hashtable、ConcurrentHashMap是使用频率较高的数据结构&#xff0c;它们都是以key-value的形式来存储数据&#xff0c;且都实现了Map接口&#xff0c;日常开发中很多人对其二者之间的区别并…

STM32F4_窗口看门狗精讲(WWDG)

目录 1. 窗口看门狗WWDG简介 2. 窗口看门狗和独立看门狗的区别 3. WWDG主要特性 4. WWDG功能 4.1 窗口看门狗框图(重要) 4.2 看门狗超时计算 5. WWDG寄存器 5.1 控制寄存器 WWDG_CR 5.2 配置寄存器 WWDG_CFR 5.3 状态寄存器 WWDG_SR 6 库函数配置窗口看门狗(采用中断…

Mybatis(五)------Mybatis执行Mapper接口的方法流程

前面几篇文章我们介绍了JDBC、Mybatis的工具类等&#xff0c;下面我们开始对于mybatis的各个机制开始解析。 前面我们知道&#xff0c;mybatis对excutor进行封装成sqlsession提供给开发人员进行数据库的增删改查&#xff0c;我们先从Mybatis最顶层的API入手。 SQLSession的创…

爬虫日常练习-艾图网单页面图片爬取

文章目录爬虫练习分析网站代码设计下载图片完整代码爬虫练习 hello&#xff0c;大家好。好久不见了&#xff0c;无聊的网友今天开始更新关于爬虫的一些日常练习。每次学习完一个新的知识后没有多的案例给自己练习真的很不舒服&#xff0c;希望该系列文章能够让刚刚开始学习爬虫…

常见面试题之Redis篇

1.1.Redis与Memcache的区别&#xff1f; redis支持更丰富的数据类型&#xff08;支持更复杂的应用场景&#xff09;&#xff1a;Redis不仅仅支持简单的k/v类型的数据&#xff0c;同时还提供list&#xff0c;set&#xff0c;zset&#xff0c;hash等数据结构的存储。memcache支持…

腾讯云CVM云服务器评测:标准型S5、S6

一、腾讯云CVM云服务器评测&#xff1a;标准型S5、S6 腾讯云服务器CVM标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好一些&#xf…

【C语言】for 关键字

&#x1f6a9;WRITE IN FRONT&#x1f6a9; &#x1f50e;介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四"&#x1f50e;&#x1f3c5;荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TOP100…

小白用chatgpt编写python 爬虫程序代码 抓取网页数据(js动态生成网页元素)

jS动态生成&#xff0c;由于呈现在网页上的内容是由JS生成而来&#xff0c;我们能够在浏览器上看得到&#xff0c;但是在HTML源码中却发现不了 一、注意&#xff1a;代码加入了常规的防爬技术 如果不加&#xff0c;如果网站有防爬技术&#xff0c;比如频繁访问&#xff0c;后面…

和开振学Spring boot 3.0之Spring MVC:④获取参数(上)

之前&#xff0c;我反复说过处理器封装了控制器&#xff0c;HandlerMapping的机制找到处理器后&#xff0c;通过处理器就能运行控制器&#xff0c;那么处理器增强了控制器什么功能呢&#xff1f; 我们用脑子想一下&#xff0c;要运行控制器之前&#xff0c;我们需要做什么&…