LeetCode快慢指针遍历和Hash高频题(二)

我是方圆
“无它,唯手熟尔”

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;
	}
}

在这里插入图片描述

原创文章 56 获赞 19 访问量 6013

猜你喜欢

转载自blog.csdn.net/qq_46225886/article/details/106089959