实现两个单链表的交叉合并可以通过以下步骤完成:
- 首先,定义两个单链表的结构体,可以使用以下代码示例:
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* head1 = NULL;
Node* head2 = NULL;
- 然后,为两个链表分别添加一些节点,可以使用以下代码示例:
// 添加节点到链表 1
head1 = (Node*) malloc(sizeof(Node));
head1->data = 1;
head1->next = (Node*) malloc(sizeof(Node));
head1->next->data = 3;
head1->next->next = (Node*) malloc(sizeof(Node));
head1->next->next->data = 5;
head1->next->next->next = NULL;
// 添加节点到链表 2
head2 = (Node*) malloc(sizeof(Node));
head2->data = 2;
head2->next = (Node*) malloc(sizeof(Node));
head2->next->data = 4;
head2->next->next = (Node*) malloc(sizeof(Node));
head2->next->next->data = 6;
head2->next->next->next = NULL;
上述代码中,我们为链表 1 添加了 3 个节点,其中包含数据分别为 1、3、5,为链表 2 添加了 3 个节点,其中包含数据分别为 2、4、6。
-
接下来,实现两个链表的交叉合并逻辑。实现思路如下:
-
定义一个新的链表作为合并后的链表;
- 依次遍历两个链表的节点并将其插入到新的链表的末尾,插入时,依次从两个链表中取出节点,将它们的 next 指针改为指向新链表。
下面是代码实现示例:
Node* merge(Node* head1, Node* head2) {
Node* merged = (Node*) malloc(sizeof(Node));
Node* current = merged;
while (head1 != NULL || head2 != NULL) {
if (head1 != NULL) {
current->next = head1;
current = head1;
head1 = head1->next;
}
if (head2 != NULL) {
current->next = head2;
current = head2;
head2 = head2->next;
}
}
return merged->next;
}
// 调用合并函数并输出结果
Node* merged = merge(head1, head2);
while (merged != NULL) {
printf("%d ", merged->data);
merged = merged->next;
}
上述代码中,我们定义了一个 merge 函数完成两个链表的交叉合并。合并后的结果存储在 merged 链表中,通过循环遍历 merged 链表并输出其中的数据,可以得到合并后的数据序列。
示例输出:
1 2 3 4 5 6
- 针对该问题,还可以使用其他思路进行实现。
例如,可以利用两个指针分别指向两个链表的头节点并进行遍历,如果发现有重复数据,则直接跳过即可。这种思路的代码实现如下所示:
Node* merge(Node* head1, Node* head2) {
Node* merged = (Node*) malloc(sizeof(Node));
Node* current = merged;
Node* pointer1 = head1;
Node* pointer2 = head2;
while (pointer1 != NULL && pointer2 != NULL) {
if (pointer1->data < pointer2->data) {
current->next = pointer1;
pointer1 = pointer1->next;
} else if (pointer1->data > pointer2->data) {
current->next = pointer2;
pointer2 = pointer2->next;
} else {
pointer1 = pointer1->next;
continue;
}
current = current->next;
}
if (pointer1 != NULL) {
current->next = pointer1;
} else if (pointer2 != NULL) {
current->next = pointer2;
}
return merged->next;
}
// 调用合并函数并输出结果
Node* merged = merge(head1, head2);
while (merged != NULL) {
printf("%d ", merged->data);
merged = merged->next;
}
上述代码中,我们使用两个指针 pointer1 和 pointer2 分别指向链表 1 和链表 2 的头节点,并对其进行遍历和比较。如果当前节点的值相等,则跳过该节点;否则将其插入到新的链表中。
示例输出:
1 2 3 4 5 6
综上所述,以上两种方法均可以实现两个单链表的交叉合并。具体选择哪种方法可以根据实际情况进行判断。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言实现两个单链表的交叉合并方式 - Python技术站