数据结构算法真题
【2019】线性表
📌 思路分析
要实现 首尾交替合并,可以分为以下几步:
找到链表的中间节点(快慢指针)。
- 快指针每次走 2 步,慢指针每次走 1 步。
- 最后慢指针停在中点。
反转链表后半部分。
- 从中点开始,把后半部分链表逆置。
交替合并两个链表。
- 前半部分:
a1,a2,a3,…
- 后半部分(逆置后):
an,an-1,…
- 按照一前一后的方式拼接。
- 前半部分:
这样不需要额外数组存储,空间复杂度是 O(1)O(1),时间复杂度是 O(n)O(n)。
📌 C++ 实现代码
typedef struct node {int data;struct node* next;
} NODE;// 反转链表
NODE* reverseList(NODE* head) {NODE* prev = nullptr;NODE* curr = head;while (curr) {NODE* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev; // 返回新的表头
}// 主函数:重新排列链表
void reorderList(NODE* head) {if (!head || !head->next) return;// 1. 快慢指针找中点NODE* slow = head;NODE* fast = head;while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;}// 2. 反转后半部分NODE* second = reverseList(slow->next);slow->next = nullptr; // 断开前半部分和后半部分// 3. 合并两个链表NODE* first = head;while (second) {NODE* t1 = first->next;NODE* t2 = second->next;first->next = second;second->next = t1;first = t1;second = t2;}
}
📌 输出结果
原链表: 1 2 3 4 5
重新排列后: 1 5 2 4 3
✅ 时间复杂度:
- 找中点 O(n)O(n)
- 反转链表 O(n)O(n)
- 合并 O(n)O(n)
总共 O(n)O(n)。
✅ 空间复杂度:
- 仅使用常数指针变量,O(1)O(1)。