已知两个长度分别为 m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是()。
目标
追踪单链表的链接变化,识别头结点、指针更新顺序和定位成本。
前置知识
建议先掌握单链表结点结构、头指针与头结点,以及已知前驱时的插删操作。
环境、输入与预期输出
- 环境:任意现代浏览器;建议准备纸笔或一份错题记录。
- 输入:本页按源文件顺序整理的 10 道选择题。
- 预期输出:一份独立作答记录,以及每道错题的错误原因和正确推理。
作答方法
- 阅读题面后点击一个选项,先写下选择依据;
- 点击“提交答案”,再核对对错、正确答案和题解;
- 做错的题点击“重新作答”后再次推导,直到能说明其余选项为什么不成立;
- 完成全部题目后再展开组件生成的答案总览,避免只记答案字母。
选择题
ds-2016-01已知表头元素为 c 的单链表在内存中的存储状态如下表所示。现将 f 存放于 1014H 处并插入单链表,若 f 在逻辑上位于 a 和 e 之间,则 a, e, f 的"链接地址"依次是( )。
结构(文字版):表中每行给出"地址 / 元素 / 链接地址"。
地址 元素 链接地址 1000H a 1010H 1004H b 100CH 1008H c 1000H 100CH d NULL 1010H e 1004H 1014H (空) (空) 表头元素是 c(位于 1008H)。1014H 是新结点 f 的预留位置。
ds-2024-01已知带头结点的非空单链表 L 的头指针为 h,指针 p 指向 L 中间的一个链表结点(不是第一个和最后一个结点)。q=p->next,p->next=q->next,q->next=h->next,h->next=q。这段代码的功能是()。
ds-drill-singly-linked-list-001下列关于单链表中"头指针"与"头结点"的说法中,错误的是( )。
ds-drill-singly-linked-list-002在不带头结点与带头结点的两种单链表上实现"在表头插入一个新结点
ds-drill-singly-linked-list-003在带头结点的单链表中,已知指针
ds-drill-singly-linked-list-004设带头结点的单链表中,指针
ds-drill-singly-linked-list-005在带头结点的单链表中,要找到倒数第
ds-drill-singly-linked-list-006对带头结点的单链表
list L: 1, 2, 3, 4
执行下列代码后,
ListNode *p = L->next, *q;
L->next = NULL;
while (p) {
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
ds-drill-singly-linked-list-007设两个带头结点的单链表
答案总览(建议完成全部题目后查看)
- 第 1 题:D
- 第 2 题:D
- 第 3 题:D
- 第 4 题:D
- 第 5 题:B
- 第 6 题:C
- 第 7 题:B
- 第 8 题:B
- 第 9 题:B
- 第 10 题:C
完成清单
思考题
- 头结点为什么能统一表头插入和删除的边界?
- 为什么在 p 后插入 s 时必须先保存 p 的原后继?
- 链表的局部修改是 O(1) 时,整体操作为什么仍可能是 O(n)?
复盘
- 我最容易在哪个前提上出错:结构类型、是否带头结点、是否循环、还是是否已知目标节点?
- 我是否能画出链接变化或写出移动次数,而不是只凭关键词选择?
- 哪道题的错误选项最有迷惑性?它利用了哪个常见概念混淆?