环形链表
link:https://leetcode.cn/problems/linked-list-cycle-ii/description/
思路分析
我只能说双指针yyds【刻板hh】
我们分两种情况来分析
起码在第二圈才会相遇 fast比slow多走环的整数倍
fast 走的步数是 slow 步数的 2 倍,即 f=2s;
fast 比 slow 多走了 n 个环的长度,即 f=s+nb;( 解析: 双指针都走过 a 步,然后在环内绕圈直到重合,重合时 fast 比 slow 多走 环的长度整数倍 )
将以上两式相减得到 f=2nb,s=nb,即 fast 和 slow 指针分别走了 2n,n 个环的周长
我们通过画图分析可得 当fast走到头节点位置时 再和slow一起前进时两者会在链表环入口节点处相遇 那么此时我们再将fast至于head位置即可.
有环
fast指针始终比slow指针多走一步 在有环的情况下必定会相遇 【每轮循环fast都靠近slow一步】
第一种结果:
如果链表存在环,则双指针一定会相遇。因为每走 1 轮,fast 与 slow 的间距 +1,fast 一定会追上 slow
第二种结果: 当fast == slow时, 两指针在环中第一次相遇
无环
fast 指针走过链表末端,说明链表无环,此时直接返回 null
ublic class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(true) {
//判断是否为空/单节点
if(fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
if(slow == fast) break;
}
//指针第二次相遇 重新使得fast指向头节点
fast = head;
while(slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
}
Tips
链表类题目一般都是用双指针解决.【比如寻找距离尾部第N哥节点 寻找环入口 寻找公共尾部入口等】
有效的字母异位词
link:https://leetcode.cn/problems/valid-anagram/description/
思路分析
最开始分析的时候暴力找规则看的脑袋大 明明可以使用数组+记录解决.【数组其实就是一个简单的哈希表】
因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false
class Solution {
public boolean isAnagram(String s, String t) {
int[] arr = new int[26];
for(char c : s.toCharArray()) {
arr[c - 'a'] += 1;
}
for(char c : t.toCharArray()) {
arr[c - 'a'] -= 1;
}
for(int i : arr) {
if(i != 0) {
return false;
}
}
return true;
}
}
Tips
给了小范围字符集可以考虑数组【简易的哈希表】
toCharArray()方法将字符串转换成字符数组.