我是
方圓
“無它,唯手熟爾”
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;
}
}