当前位置: 首页 > news >正文

链表_必会面试题2

目录

一、链表分割

二、求公共节点

三、给定⼀个链表,判断链表中是否有环。

四、链表是否有环2

力扣链表刷题链接:


一、链表分割

以给定值x为基准将链表分割成两部分,所有小于x的结点排在⼤于或等于x的结点之前。

OJ链接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

看完题目后,其实可以很明显地明白思路,也就是给定一个数字x,比x小的放一边,大于等于x的放一边,组成两个链表后,再将两个链表链接到一起。

比如给定一个x=25,就可以分成以上的两个链表。

来看代码:

public class Partition { public ListNode partition(ListNode pHead, int x) { // write code here if(pHead == null) { return null; } ListNode bs = null; ListNode be = null; ListNode as = null; ListNode ae = null; ListNode cur = pHead; while(cur != null) { if(cur.val < x) { //小于x if(bs == null) { //说明这是第一次进行插入 bs = be = cur; }else { be.next = cur; be = be.next; } }else { //大于等于x if(as == null) { as = ae = cur; }else { ae.next = cur; ae = ae.next; } } cur = cur.next; } //第一个段 没有数据 if(bs == null) { return as; } be.next = as; if(as != null) { ae.next = null; } return bs; } }

二、求公共节点

输⼊两个链表,找出它们的第⼀个公共结点。

OJ链接:

https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

如图所示,思路如下:

也就是:

  1. 分别求2个链表的长度 len1 len2 = len —— len 有可能是负数

  2. 让长的链表 先走差值步,最后一起走 —— 哪个链表长

  3. 直到相遇

有了思路后,来看代码:

public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode pl = headA; ListNode ps = headB; //这里保存headA这个链表的长度 int lenA = 0; //这里保存headB这个链表的长度 int lenB= 0; //分别求长度 while( pl != null) { lenA++; pl = pl.next; } while( ps != null) { lenB++; ps = ps.next; } pl = headA; ps = headB; //计算差值 int len = lenA - lenB; if(len < 0) { pl = headB; ps = headA; len = lenB - lenA; } //pl一定指向最长的链表 ps一定指向最短的链表 len一定是正数 while(len != 0) { pl = pl.next; len--; } while(pl != ps) { pl = pl.next; ps = ps.next; } return pl; } }

三、给定⼀个链表,判断链表中是否有环。

OJ链接:https://leetcode.cn/problems/linked-list-cycle/description/

如何理解思路呢?

如图所示,假如链表有一个环,那么直接使用快慢指针法:

每次让fast走两步,slow走一步,那它们的差值就是一步

一个环的极限长度就是1;

那么当它们差值唯一时,只要有环,那么一定会相遇!

来看简单的代码:

public class Solution { public boolean hasCycle(ListNode head) { ListNode fast = head; ListNode slow = head; while(fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if(fast == slow) { return true; } } return false; } }

四、链表是否有环2

给定⼀个链表,返回链表开始⼊环的第⼀个节点。如果链表⽆环,则返回NULL

OJ链接:

https://leetcode.cn/problems/linked-list-cycle-ii/description/

思路可参考第三点,基本一样的思路,此处不赘述了。

代码:

/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode detectCycle(ListNode head) { ListNode fast = head; ListNode slow = head; while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if (fast == slow) { break; } } //1.没有环 2.有环(遇到break结束) if (fast == null || fast.next == null) { return null;//没有环 } fast = head; while (fast != slow) { fast = fast.next; slow = slow.next; } return slow; } }

力扣链表刷题链接:

链表 - 力扣(LeetCode)全球极客挚爱的技术成长平台

多刷题!画图+思考+写代码+调试

http://www.jsqmd.com/news/497583/

相关文章:

  • 数据库安全最后一公里:金仓SQL防火墙如何填平开发留下的注入坑
  • 1391、STM32单片机智能语音识别分类垃圾桶 超声波检测溢满报警 语音播报垃圾分类(程序+原理图+PCB文件+proteus仿真+参考论文+开题报告+原理图文字讲解+程序流程图+硬件框图+器件清单
  • 「龙虾」来了!OpenClaw如何掀起AI智能体革命
  • 东华复试day17
  • 挺黑色幽默的笑话
  • python-flask导师选择分配管理系统 _0spy6
  • 基于LangChain的RAG与Agent智能体开发 - OpenAI库介绍和使用
  • 四川大学团队破解“万能图像修复“难题
  • AOP相关面试题
  • 提示系统SQL优化从慢到快:架构师用提示工程实现查询响应速度提升10倍
  • 英集芯IP2391N支持低功耗Boost充电的微光能量收集芯片
  • PCB抄板技术全流程解析
  • 如何在Dev-C++中设置临时环境变量?
  • 【码道初阶-Hot100】LeetCode 438 + 567 对照详解:一套滑动窗口模板,彻底讲透“固定长度窗口 + 计数数组 + count维护”
  • 基于「YOLO目标检测 + 多模态AI分析」的热轧钢带表面缺陷检测分析系统
  • 24大数据 R语言代码合集
  • 爬虫对抗实战 - ZLibrary反爬机制分析与突破
  • Spring Boot 配置文件优先级机制
  • intel wifi AX200停用,无线连接都不能用。
  • 【第7篇】Mamba 100篇合集 · 从入门到天花板
  • SQL SERVER 登陆错误:18456
  • 虚拟实验室:物理化学实验的计算机模拟
  • 图的领接矩阵表示法
  • 软件文档管理中的权限控制机制
  • Android Developer的这段代码的注释(kotlin的类和对象
  • 如何评估大数据产品的用户满意度?
  • Day03——java基础语法
  • 多格式电子书阅读软件KOReader,你的阅读终极伴侣!
  • 低代码-无代码平台背后的开源技术
  • 免费降AI率的上限在哪?从技术角度分析效果天花板