题1 链表的中间结点

描述

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
提示:
给定链表的结点数介于 1 和 100 之间。

题解1 双指针法

思路:用两个指针,p是慢指针,q是快指针,移动速度是p的两倍,当q到达末尾的时候,p指针正好指在链表中间。

class Solution {public ListNode middleNode(ListNode head) {ListNode q = head;ListNode p = head;while(q != null && q.next != null){q = q.next.next;p = p.next;}return ;}
}

题解2 单指针法

思路:首先遍历链表,得到链表长度,然后遍历至链表长度二分之一处

class Solution {public ListNode middleNode(ListNode head) {int n = 0;ListNode cur = head;while (cur != null) {++n;cur = cur.next;}int k = 0;cur = head;while (k < n / 2) {++k;cur = cur.next;}return cur;}
}

题解3 数组法

思路:链表的缺点在于不能通过下标访问对应的元素。因此我们可以考虑对链表进行遍历,同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。

class Solution {public ListNode middleNode(ListNode head) {ListNode[] A = new ListNode[100];int t = 0;while (head != null) {A[t++] = head;head = head.next;}return A[t / 2];}
}

题2 环形链表

描述

给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

题解1 快慢指针法

思路:如果存在环,快慢指针总会相遇。

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public boolean hasCycle(ListNode head) {ListNode i = head;ListNode j = head;while(i != null && i.next != null){i = i.next.next;j = j.next;if(i == j){return true;}}return false;}
}

题解2 哈希表法

思路:通过检查一个结点此前是否被访问过来判断链表是否为环形链表。常用的方法是使用哈希表。我们遍历所有结点并在哈希表中存储每个结点的引用(或内存地址)。如果当前结点为空结点 null(即已检测到链表尾部的下一个结点),那么我们已经遍历完整个链表,并且该链表不是环形链表。如果当前结点的引用已经存在于哈希表中,那么返回 true(即该链表为环形链表)。

public boolean hasCycle(ListNode head) {Set<ListNode> nodesSeen = new HashSet<>();while (head != null) {if (nodesSeen.contains(head)) {return true;} else {nodesSeen.add(head);}head = head.next;}return false;
}

题3 实现strStr()

描述

题解1

思路:如果子串为空,返回0。如果子串长于原字符串剩余字符串,则找不到,返回-1。如果原字符串当前位置和子串首字母匹配,则对照字符串依次匹配字符,如果子串全匹配,返回i,否则退出子串的循环,原字符串当前位置向后移动。

class Solution {public int strStr(String haystack, String needle) {if(needle.length() == 0){return 0;}for(int i = 0; i < haystack.length(); i++){if ((haystack.length() - i) < needle.length()) {return -1;}if(haystack.charAt(i) == needle.charAt(0)){boolean flag = true;for(int j = 0; j < needle.length(); j++){if(haystack.charAt(i+j) != needle.charAt(j)){flag = false;}}if(flag){return i;}}}return -1;}
}

题解2 滑动窗口+subString

class Solution {public int strStr(String haystack, String needle) {int L = needle.length(), n = haystack.length();for (int start = 0; start < n - L + 1; ++start) {if (haystack.substring(start, start + L).equals(needle)) {return start;}}return -1;}
}

题解3 双指针法

思路:pn指向原字符串,pL指向子串,当在原字符串中找到匹配子串第一个字母时,比较两字符串,记录相同的字符数,遇到不同的字符即退出比较循环,如果相同字符数等于子串字符数,返回pn减去子串长度(原串和子串在一起移动)。如果相同字符数不等于子串字符数,说明匹配失败,原字符串要回溯到比较循环之前的位置,即pn-子串长度+1位置。

class Solution {public int strStr(String haystack, String needle) {int L = needle.length(), n = haystack.length();if (L == 0) return 0;int pn = 0;while (pn < n - L + 1) {// find the position of the first needle character// in the haystack stringwhile (pn < n - L + 1 && haystack.charAt(pn) != needle.charAt(0)) ++pn;// compute the max match stringint currLen = 0, pL = 0;while (pL < L && pn < n && haystack.charAt(pn) == needle.charAt(pL)) {++pn;++pL;++currLen;}// if the whole needle string is found,// return its start positionif (currLen == L) return pn - L;// otherwise, backtrackpn = pn - currLen + 1;}return -1;}
}

【LeetCode】3月23日打卡-Day8相关推荐

  1. 2020年6月23日打卡

    打卡 2020年6月23日 计划与安排 Leetcode 67. 二进制求和 学习笔记 这位先生我能占用您一点时间吗-- 计划与安排 预期每天在博客中叙述如下内容: 每日做leetcode的感悟与题解 ...

  2. leetcode.cn 2022年11月4日 打卡题 754. 到达终点数字【一元二次方程解法,时间复杂度O(1)】

    leetcode 2022年11月4日 打卡题 754. 到达终点数字 写在前面   首先感谢 @子不语 大佬发布的一元二次方程代码实现的启发.题解链接:子不语-754. 到达终点数字   本文侧重梳 ...

  3. 大乐斗2服务器维护,2月23日更新公告

    超值福袋再次来袭!内力融合全新开放~ 更新时间2月23日18:00-24:00,不停机维护. 1.四种福袋来助力,幸运红包有惊喜 活动时间:2月23日18点至3月3日18点 活动期间,共销售四种福袋, ...

  4. AI:2020年6月23日北京智源大会演讲分享之机器学习专题论坛——09:45-10:25邢波教授《A Blueprint of Standardized and Composable ML》

    AI:2020年6月23日北京智源大会演讲分享之机器学习专题论坛--09:45-10:25邢波教授<A Blueprint of Standardized and Composable ML&g ...

  5. 拉结尔6月21日服务器维护,拉结尔6月23日停服维护公告

    拉结尔手游将在6月23日进行短暂的维护更新哦!不清楚具体更新内容究竟是什么的小伙伴们,接下来就让我们一起来看一下吧~! 拉结尔6月23日停服维护公告 尊敬的探索者,<拉结尔>于6月19日更 ...

  6. 安装ssr_12月23日先锋首测启动,累计登录3天必得SSR!

    悠长的等待即将结束.随着一代鬼王的离世,京都世界的各路妖怪正蠢蠢欲动,您,能成为众望所归的新一代鬼王吗? 很荣幸告诉各位少主,<百鬼夜行>手游不限量先锋首测将于12月23日启动,12月22 ...

  7. 互联网晚报 | 2月18日 星期五 | 高途宣布停止高中学科辅导服务;小红书启动最严医美专项治理;FF 91量产版2月23日发布...

    今日看点 ✦ 我国"东数西算"工程正式全面启动,8地建设国家算力枢纽节点 ✦ 华为投资40亿元进入深圳香蜜湖,建设数字能源总部及研发基地 ✦ 中兴通讯:成立汽车电子产品线,布局并开 ...

  8. 互联网日报 | 3月12日 星期五 | 京东全年净增1.1亿活跃用户;百度计划3月23日登陆港交所;中国联通首次公布5G用户数...

    今日看点 ✦ 中国联通2020年实现主营业务收入2758亿元,5G套餐用户达7083万户 ✦ 京东集团2020年净收入达7458亿元,净增近1.1亿活跃购买用户 ✦ 百度3月12日正式开启全球发售,计 ...

  9. 为什么遇见逆水寒服务器维修,《遇见逆水寒》4月23日更新公告

    亲爱的旅人: 所有江湖偶遇,都是宿命相逢.唯美古风恋爱手游<遇见逆水寒>本周维护更新! [维护时间] 4月23日(周四)7:00至11:00(预计) [补偿内容] 更新补偿红尘x1500 ...

最新文章

  1. 论电子计算机在审计中的应用,计算机技术在审计中的应用领域分析.doc
  2. Confluence 6 CSS 编辑技巧
  3. 【JAVA进阶】——myEclipse连接mysql启动数据库服务
  4. 【强化学习】从强化学习基础概念开始
  5. 身份反模式:联邦筒仓和意大利面条身份
  6. Vue 组件间通信六种方式
  7. 黑马程序员-JavaAPI-17天-4(Arrays)
  8. 谷歌引擎html,国内免费使用谷歌翻译引擎
  9. 师慧gis三维虚拟校园在高校教学管理中的应用价值
  10. 北京内推 | 微软亚洲研究院机器学习组招聘AI药物发现研究实习生
  11. [自学考试] [02142数据结构导论] Part1 概论
  12. Simulink中利用Powergui进行FFT分析,但是信号源始终为空
  13. 未受信任的企业级开发者_在 iOS 上安装自定企业级应用
  14. Springboot集成datax方案小记
  15. 【超简单】利用Python去除图片水印,太神奇了叭,你还不会嘛?(附三种方法)
  16. AI实战:文本自动摘要简述
  17. 微信小程序获取用户信息(昵称、头像、openid等)
  18. GTID 模式 - 通过跳过事务解决主从故障
  19. UITableView顶部多出一截空白问题
  20. 金雅拓推出两项全新的身份证件安全增强功能

热门文章

  1. 秀操作 | 函数宏的三种封装方式
  2. Android 7.1 bootchart触发后导致不断重启
  3. SPI、I2C、UART三种串行总线的原理、区别及应用
  4. 核酸结果统计难?130行代码实现基于ocr的核酸截图识别存储Excel(复现代码核查核酸报告)
  5. git版本控制系统常用指令,Xmind笔记整理
  6. git 提交文件_git原理与实战
  7. LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)
  8. LeetCode 562. 矩阵中最长的连续1线段(DP)
  9. [Hands On ML] 3. 分类(MNIST手写数字预测)
  10. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)