Yoru Karu Studio
程式設計學習筆記 | LeetCode 解題分享程式設計學習筆記 | LeetCode 解題分享
題目描述 給定兩個已排序的鏈結串列 list1 和 list2 的頭節點。
將這兩個串列合併成一個已排序的串列。合併後的串列應該透過拼接前兩個串列的節點來建立。
返回合併後鏈結串列的頭節點。
範例 範例 1:
輸入:list1 = [1,2,4], list2 = [1,3,4] 輸出:[1,1,2,3,4,4]範例 2:
輸入:list1 = [], list2 = [] 輸出:[]範例 3:
輸入:list1 = [], list2 = [0] 輸出:[0]限制條件 兩個串列的節點數量範圍為 [0, 50] -100 <= Node.val <= 100 list1 和 list2 都按照非遞減順序排列 核心概念:什麼是 head? 在深入解法之前,先理解一個重要概念:head(頭節點)。
鏈結串列結構: head -> [1] -> [2] -> [3] -> [4] -> null ↑ 這個就是 head(頭節點)為什麼 head 很重要?
存取整個串列的唯一入口:在鏈結串列中,我們只能透過 head 來存取整個串列 代表整個串列:當題目說「返回合併後鏈結串列的頭節點」,就是要返回新串列的第一個節點 解法一:迭代法(使用虛擬頭節點) 什麼是 dummy node(虛擬頭節點)? dummy node 是一個輔助節點,它的值不重要(通常設為 0),主要目的是簡化鏈結串列操作的邊界條件。
題目描述
如果在將所有大寫字符轉換為小寫字符、並移除所有非字母數字字符之後,短語正著讀和反著讀都一樣,則可以認為該短語是一個回文串。
字母和數字都屬於字母數字字符。
給定一個字串 s
,驗證它是否是回文串,只考慮字母和數字字符,可以忽略字母的大小寫。
範例 1:
輸入:s = "A man, a plan, a canal: Panama"
輸出:true
解釋:"amanaplanacanalpanama" 是回文串
範例 2:
輸入:s = "race a car"
輸出:false
解釋:"raceacar" 不是回文串
範例 3:
輸入:s = " "
輸出:true
解釋:在移除非字母數字字符之後,s 是一個空字串 ""
由於空字串正著反著讀都一樣,所以是回文串
限制條件:
1 <= s.length <= 2 * 10^5
- 字串
s
由 ASCII 字符組成
題目描述
給定一個二元樹,返回其最大深度。
二元樹的最大深度是從根節點到最遠葉子節點的最長路徑上的節點數。
注意:葉子節點是指沒有子節點的節點。
範例 1:
輸入:root = [3,9,20,null,null,15,7]
輸出:3
解釋:
3
/ \
9 20
/ \
15 7
最大深度為 3
範例 2:
輸入:root = [1,null,2]
輸出:2
解釋:
1
\
2
最大深度為 2
範例 3:
輸入:root = []
輸出:0
解釋:空樹的深度為 0
限制條件:
- 樹中節點數的範圍是
[0, 10^4]
-100 <= Node.val <= 100
LeetCode 解題思路:Binary Tree Inorder Traversal(二叉樹的中序遍歷) 題目描述 給定一個二叉樹的根節點 root,返回它的中序遍歷。
範例 範例 1:
輸入:root = [1,null,2,3] 1 \ 2 / 3 輸出:[1,3,2]範例 2:
輸入:root = [] 輸出:[]範例 3:
輸入:root = [1] 輸出:[1]限制條件 樹中節點數目在範圍 [0, 100] 內 -100 <= Node.val <= 100 進階:遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
核心概念 1. 什麼是中序遍歷? 中序遍歷(Inorder Traversal)的順序是:左子樹 → 根節點 → 右子樹
對於二叉樹: 4 / \ 2 6 / \ / \ 1 3 5 7 中序遍歷順序:1 → 2 → 3 → 4 → 5 → 6 → 7 (注意:對於二叉搜索樹,中序遍歷會得到升序序列)2.
LeetCode 解題思路:Merge Sorted Array(合併兩個有序數組) 題目描述 給你兩個按非遞減順序排列的整數數組 nums1 和 nums2,另有兩個整數 m 和 n,分別表示 nums1 和 nums2 中的元素數目。
請你合併 nums2 到 nums1 中,使合併後的數組同樣按非遞減順序排列。
注意:最終的排序數組不應由函數返回,而是儲存在數組 nums1 中。為了應對這種情況,nums1 的初始長度為 m + n,其中前 m 個元素表示應合併的元素,後 n 個元素為 0,應忽略。nums2 的長度為 n。
範例 範例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合併 [1,2,3] 和 [2,5,6] 結果是 [1,2,2,3,5,6]範例 2:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合併 [1] 和 [] 結果是 [1]範例 3:
LeetCode 解題思路:Remove Duplicates from Sorted List(刪除排序鏈表中的重複元素) 題目描述 給定一個已排序的鏈表的頭節點 head,刪除所有重複的元素,使每個元素只出現一次。返回已排序的鏈表。
範例 範例 1:
輸入:head = [1,1,2] 輸出:[1,2] 視覺化: 1 → 1 → 2 → null ↓ 1 → 2 → null範例 2:
輸入:head = [1,1,2,3,3] 輸出:[1,2,3] 視覺化: 1 → 1 → 2 → 3 → 3 → null ↓ 1 → 2 → 3 → null限制條件 鏈表中的節點數在範圍 [0, 300] 內 -100 <= Node.val <= 100 題目保證鏈表是按升序排列的 核心概念 1. 問題本質分析 關鍵觀察:
已排序:相同的元素一定相鄰 刪除重複:保留第一個,刪除後續重複的 原地修改:不需要創建新鏈表 2.