在 O(1) 时间内连接两个链表

17 Mar 2025 | 6 分钟阅读

在本教程中,我们将探讨如何在 O(1) 时间内连接两个链表。

什么是链表?

链表是一种线性数据结构,其中成员不会存储在连续的内存位置。链表的元素通过指针连接,如下图所示:

Concatenation of two Linked Lists in O(1) time

单向链表

  • 这是最常见的链表类型。
  • 在单向链表中,每个节点包含一些数据和一个指向下一个节点的指针。
  • 我们必须单向移动,从头部到尾部。

双向链表

  • 这是一种链表,可以双向移动,从头部到尾部,也可以从尾部到头部。
  • 双向链表 (DLL) 除了下一个指针和数据外,还有一个额外的指针,有时称为前一个指针。

循环链表

  • 循环链表是一种链表,其中所有节点都连接起来形成一个循环。
  • 循环链表中的第一个节点和最后一个节点相互连接,形成一个圆。
  • 因此,最后没有 NULL。

1. 对于单向链表和双向链表

给定至少每个列表都有一个指向最后一个节点的指针,可以在 O(1) 时间内连接两个列表(双向链表或单向链表)。(还有一些链接连接到列表头。)

我们以单向链表为例来检验它是如何工作的,但它也适用于双向链表。

C++ 程序

输出

First Linked List: 
1 2 3 4 5 
Second Linked List: 
6 7 8 9 10 
First Linked List after concatenation: 
1 2 3 4 5 6 7 8 9 10

Java 程序

输出

First Linked List: 
1 2 3 4 5 
Second Linked List: 
6 7 8 9 10 
First Linked List after concatenation: 
1 2 3 4 5 6 7 8 9 10

时间复杂度O(1)。

辅助空间O(1)。

2. 对于循环链表

我们可以简单地在 O(1) 时间内连接它们,使用循环链表。这仅仅是断开两个列表中的一个链接然后将它们连接起来。当然,这假定元素的顺序并不重要。

实施

C++ 程序

输出

Before Concatenation, First circular linked list: 1 2 3 4 5 
Before Concatenation, Second circular linked list: 6 7 8 9 10 
After Concatenation, First circular linked list: 1 7 8 9 10 6 2 3 4 5 
After Concatenation, Second circular linked list: 6 2 3 4 5 1 7 8 9 10

Python 程序

输出

Before Concatenation, First circular linked list: 1 2 3 4 5 
Before Concatenation, Second circular linked list: 6 7 8 9 10 
After Concatenation, First circular linked list: 1 7 8 9 10 6 2 3 4 5 
After Concatenation, Second circular linked list: 6 2 3 4 5 1 7 8 9 10

时间复杂度O(1)。

辅助空间O(1)。