力扣刷题Day4

24. 两两交换链表中的节点

题目:力扣

难点在与如何模拟节点的交换,在编码实现的时候容易出现杂乱而导致循环节点的出现。

在自己实现的时候,出现的错误:

  • 把head和head.next作为迭代的基准,但是存在的问题是:在循环内部需要判断head.next是否为null才能判断循环是否可以继续否则报错;涉及到了point、head、head.next三个指针的变换,容易出错,非常麻烦 --> 把point以及head作为迭代的基准 =point后的第一个位置和第二个位置交换顺序,循环的先决条件判断 point后的节点是否为null,point.next.next节点是否为null 【0/1 不用交换】
  • 在将节点进行交换之后,需要先把后面缓存的节点和前面交换好的节点先连接起来,再将point 和 head进行移位

  

 public ListNode swapPairs(ListNode head) {if(head == null || head.next == null){return head;}ListNode dummy = new ListNode(0);ListNode point = dummy;dummy.next = head;while(point.next != null && point.next.next != null){ListNode temp = head.next.next;//后面的节点进行缓存point.next = point.next.next;//先确定point后的第一个位置point.next.next = head;//再确定point后的第二个位置head.next = temp;//将缓存接上point = head;//先将point移位head = head.next;//再将head移位}return dummy.next;}

参考资料:代码随想录 

19. 删除链表的倒数第N个节点

题目:力扣

第一解题思路:先扫描一遍获得链表长度,然后找到要删除的位置,再进行第二次扫描,删除这个节点。

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode cur1 = dummy;ListNode cur2 = dummy;int size = 0;while(cur1.next != null){cur1 = cur1.next;size++;}int index = size - n;for(int i=0; i<index; i++){cur2 = cur2.next;}cur2.next = cur2.next.next;return dummy.next;}

进阶版本的实现方法:其实不难发现,这两次迭代其实可以合并成一次 - 使用双指针:快指针先走,慢指针慢n步再走,当快指针到了之后,慢指针也到了要删除节点的位置,直接删除节点即可。

注意:使用虚拟指针

 public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode fast = dummy;ListNode slow = dummy;for(int i=0; i<n; i++){fast = fast.next;}while(fast.next != null){fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummy.next;}

 参考资料:代码随想录

面试题02.07 链表相交 

题目:力扣

注意这里链表相交需要判断的的并不是两个链表中的节点值是否相等,而是地址是否相等;

因此可以想到使用hash集合来判断ListNode这个节点是否是相同的。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {HashSet<ListNode> set = new HashSet<>();while(headA != null){set.add(headA);headA = headA.next;}while(headB != null){if(set.contains(headB)) return headB;headB = headB.next;}return null;}

时间复杂度:O(m+n),其中 m 和 n 是分别是链表 headA 和 headB 的长度。需要遍历两个链表各一次。
空间复杂度:O(m),其中 m 是链表 headA 的长度。需要使用哈希集合存储链表 headA中的全部节点。

更优的办法是采用双指针 - 降低空间复杂度为O(1):

方法一:

要相交的话,若长度不同,则只能在后面相同长度部分相交,所以让长的链表先移动到和短的链表长度相同的位置。
然后判断是否A和B的节点相等,不相等则同时向后移动 - 移动过程无需判断是否为null,因为在长度相同的位置了,就算是null,也是同时为null。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {int lenA = 0;int lenB = 0;ListNode curA = headA;ListNode curB = headB;//计算A长度while(curA != null){curA = curA.next;lenA++;}//计算B长度while(curB != null){curB = curB.next;lenB++;}//初始化指针curA = headA;curB = headB;//若A比B长if(lenA >= lenB){//先将A移动到和B长度一样的位置for(int i=0; i<lenA - lenB; i++){curA = curA.next;}while(curA != curB){//判断node是否一样而不是判断node中的值是否一样curA = curA.next;curB = curB.next;}}else{//先将B移动到和A长度一样的位置for(int i=0; i<lenB - lenA; i++){curB = curB.next;}while(curA != curB){//判断node是否一样而不是判断node中的值是否一样curA = curA.next;curB = curB.next;}}return curA;}

 方法二:

若两个链表能相交的话,那么从A点出发再从B点出发,两个指针一定能够相遇。

证明:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headA == null || headB == null){return null;}ListNode curA = headA;ListNode curB = headB;//循环以找到A和B相同节点为止 - 若A和B不相交,则相同节点为null节点while(curA != curB){//若A节点走完了,则从B节点继续走if(curA == null){curA = headB;}else{curA = curA.next;}//若B节点走完了,则从A节点继续走if(curB == null){curB = headA;}else{curB = curB.next;}}return curA;}

参考资料:

代码随想录        力扣

 142.环形链表

1.判断链表是否有环

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。

2.如果有环,如何找到这个环的入口

从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点

142环形链表5

 

那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。

因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 fast指针走过的节点数 = slow指针走过的节点数 * 2:

(x + y) * 2 = x + y + n (y + z)

两边消掉一个(x+y): x + y = n (y + z)

因为要找环形的入口,那么要求的是x,因为x表示 头结点到 环形入口节点的的距离。

所以要求x ,将x单独放在左面:x = n (y + z) - y ,

再从n(y+z)中提出一个 (y+z)来,整理公式之后为如下公式:x = (n - 1) (y + z) + z 注意这里n一定是大于等于1的,因为 fast指针至少要多走一圈才能相遇slow指针。

这个公式说明什么呢?

先拿n为1的情况来举例,意味着fast指针在环形里转了一圈之后,就遇到了 slow指针了。

当 n为1的时候,公式就化解为 x = z

 在实现的时候写while循环的时候犯了低级的bug:while(fast == slow)用来判断是否继续循环 - 用于找到第一次相遇;但是初始 fast和slow都是head循环直接停止。

正确的while循环写法:

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){//说明有环ListNode cur = head;while(cur != fast){ //找到环入口cur = cur.next;fast = fast.next;}return cur;}}return null;}

参考:代码随想录

链表总结:

 代码随想录

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

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

相关文章

力扣刷题流程--记录用

目前已完成第一小节的做题任务&#xff0c;前路漫漫啊。 第一部分 数据结构基础&#xff08;155 题&#xff09; 数组和字符串&#xff08;22 题&#xff09; 数组类算法&#xff08;12 题&#xff09; 链表&#xff08;15 题&#xff09; 队列 & 栈&#xff08;2…

【力扣刷题 | 第五天】

目录 前言&#xff1a; 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 结束&#xff1a; 前言&#xff1a; 今天两道题类型相似&#xff0c;解法思路一致&#xff0c;都利用了双指针技术。 15. 三数之和 - 力…

力扣-刷题记录

189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 力扣https://leetcode.cn/problems/rotate-array/description/ void rotate(int* nums, int numsSize, int k){if(k > numsSize){k % numsSize;}if(k0){f…

出海周报|Temu在美状告shein、ChatGPT安卓版上线、小红书回应闪退

工程机械产业“出海”成绩喜人&#xff0c;山东相关企业全国最多Temu在美状告shein&#xff0c;跨境电商战事升级TikTok将在美国推出电子商务计划&#xff0c;售卖中国商品高德即将上线国际图服务&#xff0c;初期即可覆盖全球超200个国家和地区ChatGPT安卓版正式上线&#xff…

方法试用:基于强化学习提高EEG分类准确率的特征选择方法(完整代码)

2023/4/19 -4/21 脑机接口学习内容一览&#xff1a; 这一篇文章主要建立在前文脑机接口随机森林判断睡眠类型与EEG前沿方法探索的基础上&#xff0c;尝试运用强化学习的方法来提高识别睡眠阶段的准确率&#xff0c;对前段时间强化学习的学习成果做一个总结。 一、强化学习类详解…

最简单容易的四格漫画制作软件 Comic Strip Factory for Mac

Comic Strip Factory for Mac是一款漫画制作软件&#xff0c;小编亲测推荐。 Comic Strip Factory 发布了最新版本1.0.137&#xff0c;专为喜欢漫画的用户准备的。无需你会绘画就可以在Mac上制作精美的漫画&#xff0c;常见的卡通四格漫画都可以用它制作。 Comic Strip Fact…

怎么用手机制作一个四格漫画(flutter)

一&#xff0c;背景 四格漫画&#xff0c;是以四个画面分格来完成一个小故事或一个创意点子的表现形式 &#xff0c;分为开头&#xff0c;发展&#xff0c;高潮&#xff0c;结尾 。那怎么用手机制作一个四格漫画呢&#xff1f;就像下图这样。 二&#xff0c;思考过程 漫画么&…

GPT-5: 超越人类语言的模型,你还不了解一下?

目录 一、GPT-5时代引领者 二、技术特性 1&#xff0c;音频和视频处理 — 更强大的多模态处理能力 2&#xff0c;GPT-5颠覆影视制作&#xff1a;重写媒体消费时代 3&#xff0c;为机器人提供智慧大脑 4&#xff0c;更强的垂直行业应用 三、回顾一下GPT5被紧急叫停&…

【论文阅读】Computational Personality: A Survey 计算性格学综述

文章目录 摘要1. 引言2. 计算性格学研究框架2.1 性格学理论基础2.1.1 性格分类模型2.1.2 性格计算&#xff08;测量&#xff09;方法 2.2 计算性格学研究框架 3. 计算性格学研究3.1 性格预测3.1.1 基于大五模型的性格预测3.1.2 基于MBTI性格量表的性格预测3.1.3 小结 3.2 抑郁检…

安装oracle时,口令管理忘记解锁scott!

首先&#xff0c;别急&#xff0c;昨天我也是百度弄了很久才弄好&#xff0c;所以今天整理一下&#xff0c;把昨天的小小成果展示出来。 步骤&#xff1a;1.进入黑屏&#xff0c;输入sqlpus&#xff1b; 2.输入用户名&#xff1a;sys&#xff1b; 输入口令&#xff1a;sys(这个…

Primavera P6用户密码锁定及管理员忘记密码处理

经常有一些同行问到&#xff0c;下面是P6 两个相对极端的问题怎么处理 A, 管理员用户被锁定&#xff08;密码还记得&#xff09; B, 管理员忘记密码 处理这类问题一般在需要在数据库层级操作&#xff0c;当然建议信息部&#xff08;或DB&#xff09;如此操作&#xff0c;毕竟不…

oracle11g忘记管理员密码

oracle的sys和system密码是我们经常忘记的&#xff0c;忘记之后我们可以通过sqlplus来修改重置。 首先打开sqlplus&#xff1a;在运行处可直接输入打开 进入窗口后&#xff0c;首先输入 sqlplus/as sysdba 口令不要输入&#xff0c;直接回车 等数据库连接上之后执行sql语…

Oracle用户密码失效解决办法

错误信息 Oracle用户密码失效后&#xff0c;通常会报如下的错误&#xff1a; java.sql.SQLException: ORA-28001: the password has expired ORA-28001: the password has expired 查看密码有效期 这时候我们需要用sysdba登陆&#xff0c;登录后执行一下语句&#xff1a; …

Oracle System密码忘记 密码修改、删除账号锁定lock

运行cmd命令行 录入 sqlplus /nolog 无用户名登录 conn /as sysdba 连接到数据本地数据alter user system identified by password; 修改System 密码 为password或者打开sqlplus软件: 窗口用户名录入:/nolog D:\oracle\ora92\bin>sqlplus /nolog SQL*Plus: Release 9…

Oracle11g密码忘记

生活中&#xff0c;容易忘记Oracle数据库system用户的密码&#xff0c;怎么办呢&#xff0c;小生带你一步步重新登上Oracle &#xff0c;及时你密码忘记了。 1、打开cmd窗口&#xff0c;输入 sqlplus / as sysdba 2、运行cmd &#xff0c;输入 alter user 用户名 account un…

oracle忘记system密码,锁定

1.按住WindowsR&#xff0c;弹出运行框&#xff0c;输入sqlplus 2.输入sqlplus/as sysdba,回车 3.输入语句:alter user system identified by system; ---- 即可修改密码为system 4.输入语句:alter user system account unlock; ---- 即可解锁用户system

Oracle忘记密码以及账户被锁的解决办法

o(╥﹏╥)o昨天安装Oracle和PLSQL弄了一天&#xff0c;好不容易PLSQL可以连接Oracle也可以登录了&#xff0c;但是今天一直提示这个错误&#xff1a; &#xff08;这是在SQL Plus里面的错误提示&#xff0c;PLSQL里也是&#xff09; 我第一反应是密码输错了&#xff0c;然后又…

基于PHP的客户分销商管理系统

基于PHP的客户分销商管理系统 一 系统介绍 客户分销商管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;角色分为分销商和管理员&#xff0c;分销商登录可以查看个人信息和客户信息。管理员登录对客户&#xff0c;分销商及业绩进行管理。 技术栈 phpmysqlbootstrap…

通用分销渠道和通用产品组的解析

SAP为了结构化数据&#xff0c;通过销售范围&#xff08;销售组织&#xff0c;销售渠道&#xff0c;产品组&#xff09;来建立销售订单&#xff0c;销售范围是销售组织&#xff0c;销售渠道和产品组集合&#xff0c;需要大量维护销售视图。 在实际中&#xff0c;有些客户可能通…

微信三级分销系统开发说明

代码段&#xff1a; 1)贴图&#xff1a;<img src"图片地址"> 2)加入连接&#xff1a;<a href"所要连接的相关地址">写上你想写的字</a> 1)贴图&#xff1a;<img src"图片地址"> 2)加入连接&#xff1a;<a href"…