# 1. 合并 K 个有序链表中逐一合并、分治合并、小顶堆三种解法的复杂度与工程取舍? A 逐一合并的总复杂度为 O(N log K) B 三种解法复杂度完全相同 C 分治合并需要 O(K) 的额外堆空间 D 小顶堆解法的时间复杂度为 O(N log K),空间 O(K) ✓ 正确答案
# 2. 判断链表有环并找入环点(Floyd 判圈),数学推导与双指针步差选择? A 快指针每次走 3 步比走 2 步更安全 B 步差为 2 时快指针相对慢指针每步逼近 1 格,环内必追上 ✓ 正确答案 C 相遇后把快指针重置到头部即可,无需重置慢指针 D 无环链表快慢指针也会相遇
# 3. 用两个栈实现队列的均摊 O(1) 复杂度分析? A push 的均摊复杂度为 O(n) B 每次 pop 都必须转移 in 的全部元素 C 队列为空当且仅当 in 为空 D 每个元素被转移进 out 恰好一次,因此均摊 O(1) ✓ 正确答案
# 4. 链表反转(迭代+递归)与成对交换中如何维护前驱/后继指针避免断链? A 迭代反转必须先保存后继再修改指针,避免断链 ✓ 正确答案 B 迭代反转时先修改 cur.next 再保存后继 C 递归反转不需要处理 head.next D 成对交换无需哨兵节点
# 5. 带随机指针链表的深拷贝(LeetCode 138)中插入-拆链三步法能做到 O(1) 额外空间,正确性如何保证? A 插入-拆链法需要 O(n) 额外空间 B 第二步应设置 p.random.next = p.next.random C 插入-拆链法靠拷贝节点紧邻原节点建立映射,空间 O(1) ✓ 正确答案 D 拆链前需先复制 random 指针
# 6. 单调队列解决滑动窗口最大值(LeetCode 239)中为什么队首是最大值、队尾淘汰更小元素,均摊 O(1) 的依据? A 队首总是当前窗口最小值 B 从队尾淘汰所有小于等于新元素的元素,因为其永远不可能成为最大值 ✓ 正确答案 C 每个元素可能多次入队出队 D 单调队列的复杂度为 O(n log n)
# 7. 链表的合并与排序中合并两个有序链表、链表归并排序的空间复杂度? A 空间复杂度为 O(n),因为需要辅助数组 B 链表归并排序不稳定 C 空间复杂度为 O(log n),来自递归栈;链表天然可 O(1) 拆分合并 ✓ 正确答案 D 找中点必须用快慢指针,无法用其他方式
# 8. 有效的括号(LeetCode 20)中用栈匹配最近的左括号,三种括号混用时右括号如何判定非法? A 栈顶总是最早入栈的左括号 B 遍历结束栈非空仍然合法 C 三种括号可以任意混配 D 右括号出现时若栈空或栈顶类型不匹配即为非法 ✓ 正确答案
# 9. 最小栈(LeetCode 155)中如何用辅助栈或“差值栈”实现 O(1) 取最小,pop 时如何同步维护? A 辅助栈存储所有元素的值 B 辅助栈存储"入栈时的当前最小值",pop 时两栈同步弹出 ✓ 正确答案 C 差值栈存当前值与最小值的差值,pop 时无需恢复 min D getMin 的时间复杂度为 O(n)
# 10. K 个一组反转链表的迭代实现中哨兵节点如何简化边界处理? A 剩余不足 K 个时仍反转 B 哨兵节点让头部反转与中间组反转共用同一套逻辑 ✓ 正确答案 C 哨兵节点增加额外的边界特判 D 反转不需要检查剩余节点数量
# 11. 回文链表判断的 O(1) 空间解法(快慢指针+反转后半段)? A 快慢指针找中点后反转后半段,再逐对比较 ✓ 正确答案 B O(1) 空间解法需要把链表复制到数组 C 快指针走 1 步、慢指针走 2 步 D 反转后半段后整个链表结构被破坏且无法恢复
# 12. 删除排序链表的重复元素(LeetCode 82/83)中保留一个与全部删除时指针如何推进,哨兵节点如何简化? A 82 与 83 的指针推进完全相同 B 83 保留一个时也需要哨兵 C 82 全部删除时,哨兵使头部连续重复也能被删除 ✓ 正确答案 D 82 只能在尾部出现重复
# 13. 约瑟夫环(报数出列求最后幸存者)中递推式 J(n,k)=(J(n-1,k)+k) mod n 如何由 n-1 规模解推出 n 规模解,O(n) 递推与链表模拟 O(nk) 的差异,n 极大而 k 很小时 O(k log n) 加速的数学依据? A 链表模拟的时间复杂度为 O(n) B 递推式 f(n,k)=(f(n-1,k)+k) mod n 由移除一人后缩放规模并平移 k 得到 ✓ 正确答案 C O(n) 递推每个幸存者位置都需要重新计算 D n 极大 k 极小时无法加速
# 14. 循环队列(环形缓冲区)的设计中数组加 head/tail 下标如何用取模回绕复用空间,为何必须用显式 count(或空一格)区分空与满,容量取 2 的幂用按位与求模的工程收益? A 用 head==tail 即可区分空与满 B 必须用显式 count 或空一格来区分空与满,因为 head==tail 有二义性 ✓ 正确答案 C 容量取 2 的幂是为了让取模运算更慢 D 循环队列无法复用已出队空间
# 15. 逆波兰表达式求值(LeetCode 150)中栈模拟求值时操作数顺序如何保证,除法与负数的截断方向? A 先弹出的是左操作数 a B 逆波兰表达式需要括号辅助 C Java 的 int 除法是向下取整 D 先弹出的是右操作数 b,减除法需按 a OP b 计算 ✓ 正确答案
# 16. 用队列实现栈(LeetCode 225)与用栈实现队列的互换,为什么一个要“倒腾”而另一个可以双栈分摊? A 队列实现栈的 pop 可以均摊到 O(1) B 栈实现队列的 pop 恒为 O(n) C 两种转换的复杂度相同 D 队列实现栈的 pop 为 O(n),因为每次都要把前 n-1 个倒腾走 ✓ 正确答案
# 17. 相交链表(LeetCode 160)中双指针交替遍历两条链表如何消除长度差,无交点时如何优雅终止? A 两指针步数不必相同 B 双指针交替走到对方链头,使两指针总步数相同,从而在交点相遇 ✓ 正确答案 C 无交点时两指针会死循环 D 需要先计算两条链的长度差
# 18. 重排链表(LeetCode 143)中找中点+反转后半段+穿插合并三步法,为什么每步都依赖上一步的正确性? A 应先反转前半段再找中点 B 穿插合并依赖后半段已反转,反转依赖中点找得正确,三步环环相扣 ✓ 正确答案 C 重排链表需要 O(n) 额外空间 D 三步顺序可以任意调整
# 19. 删除链表的倒数第 N 个结点(LeetCode 19)中一次遍历的双指针(快指针先走 N 步)如何配合哨兵节点? A 哨兵节点无法处理删除头结点的情况 B 需要两次遍历求出链表长度 C 快指针先走 N 步,慢指针落后 N 步,停在待删节点前驱 ✓ 正确答案 D 快慢指针间距为 N+1
# 20. 链表的中点查找中快慢指针为何安全,奇数/偶数长度的终止条件? A 偶数长度时 slow 指向靠后的中间节点 B 快慢指针可能越界 C 快指针每次走 1 步 D 终止条件是 fast==null 或 fast.next==null,分别对应偶数和奇数长度 ✓ 正确答案
# 21. 扁平化多级双向链表(LeetCode 430)中如何用栈模拟 DFS 的遍历顺序并正确重连 next/prev 指针? A 用栈保存"旁路 next"以支持 DFS 回溯 ✓ 正确答案 B 重连时只需设置 next 指针 C 使用 child 后无需置 null D 扁平化顺序是 BFS 层序