我是
方圆
“无它,唯手熟尔”
141. 环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环
示例:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
class Solution{
public boolean hasCycle(ListNode head){
//判空
if(head == null || head.next == null)
return false;
//创建快慢指针
ListNode fast = head.next;
ListNode slow = head;
//在slow和fast没有相遇的时候进行循环
while(slow != fast){
//如果fast能跑到头,说明没有环
if(fast == null || fast.next == null){
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
}
}
202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
//同样也是应用快慢指针遍历,若是快乐数,则没有链表环
class Solution{
//自己先写一个getNext()函数
public int getNext(int n){
int totalSum = 0;
//计算各位的平方和
while(n > 0){
int num = n % 10;
totalSum += num * num;
n /= 10;
}
return totalSum;
}
public boolean isHappy(int n){
//定义快慢数
int fast = getNext(n);
int slow = n;
//slow追不上fast的时候进行循环
//当没有环的情况下,slow和fast最终都为1,是快乐数
//当有环的情况下,fast和slow能在环上相遇,不是快乐数
while(slow != fast){
slow = getNext(slow);
fast = getNext(getNext(fast));
}
return fast == 1;
}
}
876. 链表的中间节点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
//利用快慢指针遍历,快指针每次走两格
//慢指针每次走一格,快指针走到头,慢指针到中间
class Solution{
public ListNode middleNode(ListNode head){
//定义快慢指针
ListNode fast = head;
ListNode slow = head;
while(fast != null || fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
1. 两数之和(Hash相关)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution{
public int[] twoSum(int[] nums,int target){
//定义一个HashMap,key为数组值,value为下标
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < nums.length;i++){
int complement = target - nums[i];
//若map中有了对应的差值
//那么则可返回结果
if(map.containsKey(complement)){
return new int[]{map.get(complement),i};
}
//map中没有找到对应的差值,添加进去
map.put(nums[i],i);
}
//没有结果,返回null
return null;
}
}