第二次刷題不在idea寫代碼,而是直接在leetcode網站上寫,“逼”自己掌握常用的函數。
標志 | 掌握程度 | 解釋 | 辦法 |
---|---|---|---|
? | Fully 完全掌握 | 看到題目就有思路,編程也很流利 | |
?? | Basically 基本掌握 | 需要稍作思考,或者看到提示方法后能解答 | |
??? | Slightly 稍微掌握 | 需要看之前寫過的代碼才能想起怎么做 | 多做 |
???? | absolutely no 完全沒有掌握 | 需要看題解才知道怎么做 | 背 |
????? | 有難度的高頻題 | 需要看題解才知道怎么做,而且過幾天就忘了這道題怎么做了 | 背背 |
22 | ?? | Easy | 鏈表 | 160/相交鏈表 | 哈希表法,時間復雜度始終是O(M+N) 雙指針法,時間復雜度最差是O(M+N),指針A遍歷完鏈表A再接著遍歷鏈表B;指針B遍歷完鏈表A再遍歷鏈表A,兩者走了相同距離時,即為答案(相交節點或者空節點) | |
---|---|---|---|---|---|---|
23 | ? | Easy | 鏈表 | 206/反轉鏈表 | 定義三個指針:lastNode curNode nextNode,curNode 從頭節點開始遍歷直到curtNode == null時結束遍歷 | ListNode lastNode = null; |
24 | ??? | Easy | 鏈表 | 234/回文鏈表 | 錯誤的思路:先翻轉鏈表,再比較翻轉前后的鏈表,這樣做翻轉前的鏈表已經不存在了,沒法比較 正確思路:快慢指針先找到鏈表的中點,然后反轉后半段鏈表,再比較鏈表的前半段和后半段 | |
25 | ? | Easy | 鏈表 | 141/環形鏈表 | 易錯點:首先要排除輸入為null的情況:if(head == null) return null; 快慢指針遍歷鏈表,如果兩指針相同則存在環形 | |
26 | ?? | Medium | 鏈表 | 142/環形鏈表II | 在141題的基礎上,多加一部即可 快慢指針相遇,證明有環 快指針指向頭節點,慢指針不變,兩指針同時向后移動,直至相遇即為環節點 | |
27 | ??? | Easy | 鏈表 | 21/合并兩個有序鏈表 | 思路很簡單,但程序有細節要注意 定義兩個指針,分別指向兩個鏈表的頭節點 當兩個指針所指節點均不為空時,比較它們的大小,誰小就加在新鏈表后,并且后移該指針 跳出循環后,可能兩條鏈表的節點都被加入新鏈表了,也有可能有一條鏈表還有節點沒被加入新鏈表,所以要手動判斷并加入。 | |
28 | ? | Medium | 鏈表 | 2/兩數相加 | 要注意,判斷最后的進位是否 > 0,> 0的話,鏈表最后再加上這個進位 對應位相加(要判斷,節點是否為空,為空的話相當于加 0) 求出當前節點的值:(進位 + 節點1的值 + 節點2的值)% 10 更新進位:(進位 + 節點1的值 + 節點2的值)/ 10 記得后移指針 | |
29 | ??? | Medium | 鏈表 | 19/刪除鏈表的倒數第N個節點 | 定義快慢指針,快指針比慢指針快n個節點。 要注意的是,如果快指針到達隊尾,說明要刪的恰好是頭節點,那么直接返回第二個節點 快慢指針向后移,直到快指針到達盡頭(下個節點為空),此時要刪的就是慢指針的下個節點 | |
30 | ??? | Medium | 鏈表 | 24/兩兩交換鏈表中的節點 | 哨兵節點+遍歷鏈表的同時交換相鄰節點 創建一個哨兵節點,并維護pre、cur、next三個節點 當pre.nextnull&&pre.next.nextnull 時,遍歷鏈表,并交換節點。 程序開始先排除head == null || head.next == null的情況 | |
31 | ???? | Hard | 鏈表 | 25/K個一組反轉鏈表 | 把鏈表分為三部分:已經反轉的、要反轉的、未反轉的 找到此次要反轉的部分的尾節點end,并把尾節點的下個節點置空;end.next == null ,結束遍歷 反轉此部分鏈表(重點) 將該部分鏈表加到已經反轉部分的后面 | |
32 | ??? | Medium | 鏈表 | 138/隨機鏈表的復制 | 使用哈希表來保存節點 遍歷鏈表,將節點保存到哈希表Map<Node, Node> 再次遍歷鏈表,將原節點中的next、random拷貝到新節點中 | |
33 | ???? | Medium | 鏈表 | 148/排序鏈表 | 歸并排序 快慢指針將鏈表分為兩半,一半為left,一半為right,如果head == null || head.next == null說明不可以再分了,就結束遞歸 left鏈表和right鏈表進行比較排序并合并,算法如21題。 最后要將不為空的節點加入到鏈表最后,再返回頭節點。 | |
34 | ??? | Hard | 鏈表 | 23/合并k個升序鏈表 | 升序的優先級隊列 PriorityQueue 遍歷數組,將每個鏈表的頭節點加入到隊列中 當隊列不為空時,循環執行以下操作 2.1 移除隊頭節點(最小節點) 2.2 將該節點的下一個節點加入到隊列(如果不為null的話) | |
35 | ????? | Medium | 鏈表 | 146/LRU緩存 | 雙向鏈表+哈希表 哈希表保存<key, Node>,便于查找key 建立雙向鏈表類與dummy哨兵節點 LRUCache(int capacity) 初始化容量、dummy節點的pre和next get操作 getKey()函數查找key是否存在,存在則返回value,否則返回-1; put操作 getKey()函數查找key是否存在,存在則更改原來的value為新的value;否則putFront()函數將key加入到最前面,并且要判斷是否超出容量,超出的話要remove()刪除尾節點 getkey() 查找哈希表中是否存在key,存在則putFront()函數將該節點加入到最前面,并返回Node,否則返回null putFront() 將節點加入到最前面,也就是dummy的后面 remove() 刪除尾節點,也就是dummy的前面 | PriorityQueue pq = new PriorityQueue<>((a,b) -> a.val - b.val); |
圖片版: