196:链表求和

LeetCode 面试题 02.05 https://leetcode.cn/problems/sum-lists-lcci/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 两数之和。 时间复杂度:O(max(m,n)),其中 m 和 n 分别为两个链表的长度。我们需要遍历两个链表的全部位置,而处理每个位置只需要 O(1) 的时间。 空间复杂度:O(1)。注意返回值不计入空间复杂度。 ...

七月 15, 2025 · Cassius

155:奇偶链表

LeetCode 328 https://leetcode.cn/problems/odd-even-linked-list/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 维护两个指针 odd 和 even 分别指向奇数节点和偶数节点,初始时 odd = head,even = evenHead。通过迭代的方式将奇数节点和偶数节点分离成两个链表,每一步首先更新奇数节点,然后更新偶数节点。 更新奇数节点时,奇数节点的后一个节点需要指向偶数节点的后一个节点,因此令 odd.next = even.next,然后令 odd = odd.next,此时 odd 变成 even 的后一个节点。 更新偶数节点时,偶数节点的后一个节点需要指向奇数节点的后一个节点,因此令 even.next = odd.next,然后令 even = even.next,此时 even 变成 odd 的后一个节点。 在上述操作之后,即完成了对一个奇数节点和一个偶数节点的分离。重复上述操作,直到全部节点分离完毕。全部节点分离完毕的条件是 even 为空节点或者 even.next 为空节点,此时 odd 指向最后一个奇数节点(即奇数链表的最后一个节点)。 最后令 odd.next = evenHead,将偶数链表连接在奇数链表之后,即完成了奇数链表和偶数链表的合并,结果链表的头节点仍然是 head。 时间复杂度:O(n),其中 n 是链表的节点数。需要遍历链表中的每个节点,并更新指针。 空间复杂度:O(1)。只需要维护有限的指针。 ...

七月 15, 2025 · Cassius

150:两数相加II

LeetCode 445 https://leetcode.cn/problems/add-two-numbers-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 反转链表+两数相加。 时间复杂度:O(n),其中 n 为 l1 长度和 l2 长度的最大值。 空间复杂度:O(1)。返回值不计入。 ...

七月 15, 2025 · Cassius

130:二叉树展开为链表

LeetCode 114 https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 采用头插法构建链表,按照右子树 - 左子树 - 根的顺序 DFS 这棵树。DFS 的同时,记录当前链表的头节点为 head。一开始 head 是空节点。 具体来说: 如果当前节点为空,返回。 递归右子树。 递归左子树。 把 root.left 置为空。 头插法,把 root 插在 head 的前面,也就是 root.right=head。 现在 root 是链表的头节点,把 head 更新为 root。 时间复杂度:O(n),其中 n 是二叉树的节点个数。 空间复杂度:O(n)。递归需要 O(n) 的栈空间。 ...

七月 15, 2025 · Cassius

129:排序奇升偶降链表

补充题 1 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 给定一个奇数位升序,偶数位降序的链表,将其重新排序。 将链表拆分成两个链表:奇数节点链表和偶数节点链表。 奇数节点链表:位置 1,3,5,…的节点,原链表奇数位置升序,所以奇数节点链表是升序的。 偶数节点链表:位置 2,4,6,…的节点,原链表偶数位置降序,所以偶数节点链表是降序的。 将偶数节点链表反转,因为降序反转后变成升序。 合并两个升序链表(奇数链表和反转后的偶数链表),合并成新的升序链表。 时间复杂度:O(n)。 空间复杂度:O(1)。 ...

七月 15, 2025 · Cassius

116:旋转链表

LeetCode 61 https://leetcode.cn/problems/rotate-list/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题是旋转链表,可以直接将链表闭合成环,再在指定位置断开。 时间复杂度:O(n),最坏情况下,我们需要遍历该链表两次。 空间复杂度:O(1),我们只需要常数的空间存储若干变量。 ...

七月 15, 2025 · Cassius

104:复制带随机指针的链表

LeetCode 138 https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 简单的做法是直接用一个哈希表把两个链表中节点的对应关系存起来,在二次遍历的时候设置新链表的 next 和 random。 此外,我们可以把新链表和旧链表混在一起。依次复制每个节点(创建新节点并复制 val 和 next),把新节点直接插到原节点的后面,形成一个交错链表。如此一来,原链表节点的下一个节点,就是其对应的新链表节点了! 然后遍历这个交错链表,假如节点 1 的 random 指向节点 3,那么就把节点 1′ 的 random 指向节点 3 的下一个节点 3′,这样就完成了对 random 指针的复制。 最后,从交错链表链表中分离出深拷贝后的链表。 时间复杂度:O(n),其中 n 是链表的长度。 空间复杂度:O(1)。返回值不计入。 ...

七月 13, 2025 · Cassius

108:LFU缓存

LeetCode 460 https://leetcode.cn/problems/lfu-cache/description/ 难度:困难 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题是 LRU 缓存的升级版。本题对于每个使用频率,都需要维护一个双向链表,并通过哈希表把频率和链表关联起来。为了找到最少的使用频率,需要维护一个 min_freq 变量。 在插入时需要插入到链表的头部,而当容量满,需要删除时需要删除的是最少使用频率的书中的尾部结点 dummy->prev。 时间复杂度:所有操作均为 O(1)。 空间复杂度:O(min(p,capacity)),其中 p 为 put 的调用次数。 ...

七月 13, 2025 · Cassius

098:两两交换链表中的节点

LeetCode 24 https://leetcode.cn/problems/swap-nodes-in-pairs/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ K 个一组反转链表的简单版本。 时间复杂度:O(n),其中 n 为链表长度。 空间复杂度:O(1)。仅用到若干额外变量。 ...

七月 6, 2025 · Cassius

096:删除排序链表中的重复元素

LeetCode 83 https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 判断下个节点,与当前节点相同就删除。 时间复杂度:O(n),其中 n 为链表的长度。 空间复杂度:O(1),仅用到若干额外变量。 ...

七月 6, 2025 · Cassius