链表、栈队列高频

共 21 题
#

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 层序