035:删除链表的倒数第 N 个结点

LeetCode 19 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 前后指针,右节点先走 n 步,然后左右节点同时走。当右节点走到最后一个节点的时候,左节点就在删除节点的前一个节点。为了处理删除第一个节点的情况,设置 dummy 节点。 时间复杂度:O(m),其中 m 为链表的长度。 空间复杂度:O(1),仅用到若干额外变量。 ...

六月 30, 2025 · Cassius

034:环形链表 II

LeetCode 142 https://leetcode.cn/problems/linked-list-cycle-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 环形链表 II,比环形链表 I 多了需要找到入环节点。 设头节点到入环口需要走 a 步,环长为 c。快慢指针相遇时,慢指针走了 b 步,快指针走了 2b 步。设快指针比慢指针多走了 k 圈,即 2b - b = kc,得 b = kc。 慢指针在入环口开始,在环中走了 b - a = kc - a 步到达相遇点。这说明从相遇点开始,再走 a 步,就恰好到达相遇点。 如果让头节点和慢指针同时走,恰好 a 步后二者必定相遇,且相遇点就在入环口。 时间复杂度:O(n),其中 n 为链表的长度。 空间复杂度:O(1),仅用到若干额外变量。 ...

六月 30, 2025 · Cassius

029:相交链表

LeetCode 160 https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 最简单的方法是使用哈希集合来记录访问过的节点。除此之外还有双指针的做法。 我来到你的城市,走过你来时的路。 初始化两个指针 p = headA, q = headB。 不断循环,直到 p == q。 每次循环,p 和 q 各向后走一步。具体来说,如果 p 不是空节点,那么更新 p 为 p->next,否则更新 p 为 headB;如果 q 不是空节点,那么更新 q 为 q->next,否则更新 q 为 headA。 循环结束时,如果两条链表相交,那么此时 p 和 q 都在相交的起始节点处,返回 p;如果两条链表不相交,那么 p 和 q 都走到空节点,所以也可以返回 p,即空节点。 时间复杂度:O(m+n),其中 m 是第一条链表的长度,n 是第二条链表的长度。除了交点,每个节点会被指针 p 访问至多一次,每个节点会被指针 q 访问至多一次。 空间复杂度:O(1)。 ...

六月 29, 2025 · Cassius

026:重排链表

LeetCode 143 https://leetcode.cn/problems/reorder-list/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 这道题目需要先找到链表的中间节点 LeetCode 876,然后反转后半部分的链表 LeetCode 206。 head 指向前半部分头节点,head2 指向后半部分的头节点。每次更新 head->next = head2, head2->next = nxt。 时间复杂度:O(n),其中 n 为链表的长度。 空间复杂度:O(1),仅用到若干额外变量。 ...

六月 29, 2025 · Cassius

022:环形链表

LeetCode 141 https://leetcode.cn/problems/linked-list-cycle/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 这道题目的做法是快慢指针。快指针每次走两步,慢指针每次走一步,如果快慢指针相等,说明链表有环。 时间复杂度:O(n),其中 n 为链表的长度。 空间复杂度:O(1),仅用到若干额外变量。 ...

六月 29, 2025 · Cassius

021:反转链表 II

LeetCode 92 https://leetcode.cn/problems/reverse-linked-list-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 这道题需要翻转中间一段链表。我们定义这段链表的前一个节点为 p0。翻转结束之后,需要修改 p0->next->next = cur, p0->next = pre。 时间复杂度:O(right)。 空间复杂度:O(1)。 ...

六月 29, 2025 · Cassius

009:合并两个有序链表

LeetCode 21 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 每次将 list1 和 list2 中较小值作为下一个节点,最后将剩余节点接在后面。 时间复杂度:O(n+m),其中 n 为 list 1 的长度,m 为 list 2 的长度。 空间复杂度:O(1)。仅用到若干额外变量。 ...

六月 27, 2025 · Cassius

005:K个一组翻转链表

LeetCode 25 https://leetcode.cn/problems/reverse-nodes-in-k-group/description/ 难度:困难 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 反转一组节点的代码与 LeetCode 206 类似,每次修改一个节点的 next。 ListNode* nxt = cur->next; cur->next = pre; pre = cur; cur = nxt; 需要注意的是,每次需要保存一组节点的上一个节点 p0,反转结束后,更新 p0 和 p0->next。 ListNode* nxt = p0->next; p0->next->next = cur; p0->next = pre; p0 = nxt; 时间复杂度:O(n),其中 n 为链表节点个数。 空间复杂度:O(1),仅用到若干额外变量。 ...

六月 25, 2025 · Cassius

003:反转链表

LeetCode 206 https://leetcode.cn/problems/reverse-linked-list/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题有迭代和递归两种解法,迭代法更易理解,且空间复杂度更优。 ...

六月 25, 2025 · Cassius

002:LRU缓存

LeetCode 146 https://leetcode.cn/problems/lru-cache/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题是双向链表和哈希表的经典题目。每个节点有 key,value,还有两个指针 prev 和 next 分别指向前一个和下一个节点。 此外,链表中还包含一个 dummy 节点,让每个节点的 prev 和 next 都不为空。 时间复杂度:所有操作均为 O(1)。 空间复杂度:O(min(p,capacity)),其中 p 为 put 的调用次数。 ...

六月 25, 2025 · Cassius