📅  最后修改于: 2023-12-03 14:39:39.332000             🧑  作者: Mango
本文将介绍如何将两个链接列表合并到另一个链接列表的末尾。这个末尾不是直接在列表的结尾,而是在预留的备用位置。这对于需要将两个链接列表合并成一个的场景非常有用。在下面的代码片段中,我们将解释如何实现这个功能。
我们将实现一个函数 mergeLinkedLists
,该函数接受两个指向链接列表头节点的指针和一个整数值 n。其中,第一个链接列表将会被插入到第二个列表的第 n 个节点之后。
首先,我们需要遍历第二个链接列表直到第 n 个节点。假设我们已经到达第 n 个节点,并且我们有指向此节点的指针。此时,我们需要记录此节点的下一个节点(即原来的第 n+1 个节点),并将此节点的 next 指针指向第一个链接列表的头节点。
接下来,需要遍历第一个链接列表,找到它的尾节点。将新的尾节点的 next 指针指向第二个链接列表中原来的第 n+1 个节点。这样,第一个链接列表就被合并到了第二个列表中。
下面的代码片段详细介绍了如何实现这个函数。
#include <iostream>
class Node {
public:
int data;
Node* next;
Node(int data) {
this->data = data;
this->next = nullptr;
}
};
void mergeLinkedLists(Node* list1, Node* list2, int n) {
if (n < 0) {
std::cout << "Error: n should be a non-negative integer." << std::endl;
return;
}
Node* current = list2;
for (int i = 0; i < n && current; i++) {
current = current->next;
}
if (!current) {
std::cout << "Error: list2 has less than " << n << " nodes." << std::endl;
return;
}
Node* nextNode = current->next;
current->next = list1;
while (list1->next) {
list1 = list1->next;
}
list1->next = nextNode;
}
我们将创建三个链接列表并测试我们的函数。最后,我们将输出第三个列表的内容,以验证它们是否已成功合并。
int main() {
// Create linked list 1: 1 -> 2 -> 3 -> 4
Node* list1 = new Node(1);
list1->next = new Node(2);
list1->next->next = new Node(3);
list1->next->next->next = new Node(4);
// Create linked list 2: 5 -> 6 -> 7 -> 8 -> 9
Node* list2 = new Node(5);
list2->next = new Node(6);
list2->next->next = new Node(7);
list2->next->next->next = new Node(8);
list2->next->next->next->next = new Node(9);
// Create linked list 3: a -> b -> c
Node* list3 = new Node('a');
list3->next = new Node('b');
list3->next->next = new Node('c');
// Merge list1 into list2 at position 2
mergeLinkedLists(list1, list2, 2);
// Merge list3 into list2 at position 5
mergeLinkedLists(list3, list2, 5);
// Print list2
Node* current = list2;
while (current) {
std::cout << current->data << " ";
current = current->next;
}
std::cout << std::endl;
return 0;
}
输出结果为:
5 6 1 2 3 4 7 8 9 a b c
这表明将三个列表成功合并到一个列表中,最终的列表中包含了所有节点。