用C语言实现:已知两个链表A和B分别表示两个集合且带有头结点,其元素按值递增排列. 编一个函数,求A和B的交集,并存放于链表A中,且A中的元素也依值递增有序排列。
时间: 2024-10-27 17:04:43 浏览: 18
在C语言中,我们可以使用双指针法来解决这个问题。首先创建一个新的链表C作为结果,然后遍历A和B两个链表。对于每个节点,如果它在两个链表中都存在,就将其添加到结果链表C中。下面是大致的步骤:
```c
#include <stdlib.h> // 用于动态内存分配
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新的节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 比较两个节点并添加交集
void mergeIntersection(ListNode* A, ListNode* B, ListNode** result) {
ListNode* tailA = A;
ListNode* tailB = B;
ListNode* dummy = createNode(0); // 初始化虚拟头节点
ListNode* current = dummy; // 当前节点指针
while (tailA && tailB) { // 只有当两个链表都有节点时继续
if (tailA->val <= tailB->val) { // 如果A的当前节点小于等于B的当前节点
current->next = tailA; // 将A的节点添加到结果链表
tailA = tailA->next; // 移动A的尾部
} else {
current->next = tailB; // 否则将B的节点添加到结果链表
tailB = tailB->next; // 移动B的尾部
}
current = current->next; // 更新当前节点
}
*result = dummy->next; // 结果链表的头节点就是实际的交集部分
// 清理不需要的部分
if (tailA) free(tailA);
if (tailB) free(tailB);
}
// 主函数示例
int main() {
// 假设A和B已经初始化
ListNode* A = ...;
ListNode* B = ...;
ListNode* intersectionResult = NULL;
mergeIntersection(A, B, &intersectionResult);
// 现在intersectionResult指向交集链表的头节点
// 可以进一步遍历并打印这个交集链表
...
return 0;
}
```
阅读全文