零 標題:算法(leetcode,附思維導圖 + 全部解法)300題之(160)相交鏈表
一 題目描述
二 解法總覽(思維導圖)
三 全部解法
1 方案1
1)代碼:
// 方案1 “自己。哈希法(JS裏的Map數據結構)”。
// 思路:
// 1)狀態初始化:resMap = new Map(), resNode = null; 。
// 2)核心1:遍歷 鏈表A ,將每個節點存入 哈希resMap 中。
// 3)核心2:遍歷 鏈表B 。
// 3.1)若 當前節點是否存在於 哈希resMap 中,則 resNode 置為當前節點 並 退出遍歷。
// 4)返回結果 resNode 。
var getIntersectionNode = function(headA, headB) {
// 1)狀態初始化:resMap = new Map(), resNode = null; 。
let resMap = new Map(),
resNode = null;
// 2)核心1:遍歷 鏈表A ,將每個節點存入 哈希resMap 中。
while (headA) {
resMap.set(headA, 1);
headA = headA.next;
}
// 3)核心2:遍歷 鏈表B 。
while (headB) {
// 3.1)若 當前節點是否存在於 哈希resMap 中,則 resNode 置為當前節點 並 退出遍歷。
if (resMap.has(headB)) {
resNode = headB;
break;
}
headB = headB.next;
}
// 4)返回結果 resNode 。
return resNode;
}
2 方案2
1)代碼:
// 方案2 “雙指針法。”。
// 參考:
// 1)https://leetcode.cn/problems/intersection-of-two-linked-lists/solution/xiang-jiao-lian-biao-by-leetcode-solutio-a8jn/
// 思路:
// 1)每步操作需要同時更新指針 pA 和 pB。
// 2)若 指針 pA 不為空,則 將指針 pA 移到下一個節點;若 指針 pB 不為空,則 將指針 pB 移到下一個節點。
// 3)若 指針 pA 為空,則 將指針 pA 移到鏈表 headB 的頭節點;若 指針 pB 為空,則 將指針 pB 移到鏈表 headA 的頭節點。
// 4)若 當指針 pA 和 pB 指向同一個節點 或 都為空時,則 返回它們指向的節點 或 null 。
var getIntersectionNode = function(headA, headB) {
let pA = headA, pB = headB;
while (pA !== pB) {
pA = pA === null ? headB : pA.next;
pB = pB === null ? headA : pB.next;
}
return pA;
}
四 資源分享 & 更多
1 歷史文章 - 總覽
| 文章名稱 | 解法 | 閲讀量 |
|---|---|---|
| 1. 兩數之和(Two Sum) | 共 3 種 | 2.7 k+ |
| 2. 兩數相加 (Add Two Numbers) | 共 4 種 | 2.7 k+ |
| 3. 無重複字符的最長子串(Longest Substring Without Repeating Characters) | 共 3 種 | 2.6 k+ |
| 4. 尋找兩個正序數組的中位數(Median of Two Sorted Arrays) | 共 3 種 | 2.8 k+ |
| 5. 最長迴文子串(Longest Palindromic Substring) | 共 4 種 | 2.8 k+ |
| 6. Z 字形變換(ZigZag Conversion) | 共 2 種 | 1.9 k+ |
| 7. 整數反轉(Reverse Integer) | 共 2 種 | 2.4 k+ |
| 8. 字符串轉換整數 (atoi)(String to Integer (atoi)) | 共 3 種 | 4.2 k+ |
| 9. 迴文數(Palindrome Number) | 共 3 種 | 4.3 k+ |
| 11. 盛最多水的容器(Container With Most Water) | 共 5 種 | 4.0 k+ |
| 12. 整數轉羅馬數字(Integer to Roman) | 共 3 種 | 3.2 k+ |
| 13. 羅馬數字轉整數(Roman to Integer) | 共 3 種 | 3.8 k+ |
| 14. 最長公共前綴(Longest Common Prefix) | 共 4 種 | 3.0 k+ |
| 15. 三數之和(3Sum) | 共 3 種 | 60.7 k+ |
| 16. 最接近的三數之和(3Sum Closest) | 共 3 種 | 4.7 k+ |
| 17. 電話號碼的字母組合(Letter Combinations of a Phone Number) | 共 3 種 | 3.1 k+ |
| 18. 四數之和(4Sum) | 共 4 種 | 11.5 k+ |
| 19. 刪除鏈表的倒數第 N 個結點(Remove Nth Node From End of List) | 共 4 種 | 1.2 k+ |
| 20. 有效的括號(Valid Parentheses) | 共 2 種 | 1.8 k+ |
| 21. 合併兩個有序鏈表(Merge Two Sorted Lists) | 共 3 種 | 1.2 k+ |
| 22. 括號生成(Generate Parentheses) | 共 4 種 | 1.1 k+ |
| 23. 合併K個升序鏈表(Merge k Sorted Lists) | 共 4 種 | 0.9 k+ |
| 24. 兩兩交換鏈表中的節點(Swap Nodes in Pairs) | 共 3 種 | 0.5 k+ |
| 25. K 個一組翻轉鏈表(Reverse Nodes in k-Group) | 共 5 種 | 1.3 k+ |
| 26. 刪除有序數組中的重複項(Remove Duplicates from Sorted Array) | 共 4 種 | 1.3 k+ |
| 27. 移除元素(Remove Element) | 共 4 種 | 0.4 k+ |
| 28. 實現 strStr()(Implement strStr()) | 共 5 種 | 0.8 k+ |
| 29. 兩數相除(Divide Two Integers) | 共 4 種 | 0.6 k+ |
| 30. 串聯所有單詞的子串(Substring with Concatenation of All Words) | 共 3 種 | 0.6 k+ |
| 31. 下一個排列(Next Permutation) | 共 2 種 | 0.8 k+ |
| 32. 最長有效括號(Longest Valid Parentheses) | 共 2 種 | 1.4 k+ |
| 33. 搜索旋轉排序數組(Search in Rotated Sorted Array) | 共 3 種 | 1.0k+ |
| 34. 在排序數組中查找元素的第一個和最後一個位置(Find First and Last Position of Element in Sorted Array) | 共 3 種 | 0.5 k+ |
| 35. 搜索插入位置(Search Insert Position) | 共 3 種 | 0.3 k+ |
| 36. 有效的數獨(Valid Sudoku) | 共 1 種 | 0.6 k+ |
| 38. 外觀數列(Count and Say) | 共 5 種 | 1.1 k+ |
| 39. 組合總和(Combination Sum) | 共 3 種 | 1.4 k+ |
| 40. 組合總和 II(Combination Sum II) | 共 2 種 | 1.6 k+ |
| 41. 缺失的第一個正數(First Missing Positive) | 共 3 種 | 1.2 k+ |
| 53. 最大子數組和(Maximum Subarray) | 共 3 種 | 0.3k+ |
| 88. 合併兩個有序數組(Merge Sorted Array) | 共 3 種 | 0.4 k+ |
| 102. 二叉樹的層序遍歷(Binary Tree Level Order Traversal) | 共 3 種 | 0.4 k+ |
| 146. LRU 緩存(LRU Cache) | 共 2 種 | 0.5 k+ |
| 206. 反轉鏈表(Reverse Linked List) | 共 3 種 | 1.0 k+ |
| 215. 數組中的第K個最大元素(Kth Largest Element in an Array) | 共 3 種 | 0.5 k+ |
| 236. 二叉樹的最近公共祖先(Lowest Common Ancestor of a Binary Tree) | 共 3 種 | 0.1 k+ |
2 博主簡介
碼農三少 ,一個致力於編寫 極簡、但齊全題解(算法) 的博主。
專注於 一題多解、結構化思維 ,歡迎一起刷穿 LeetCode ~