已知两个依元素值递增有序排列的链表A和B,且同一表中的元素值各不相同。构造一个单链表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列,用c语言实现
时间: 2024-02-13 07:02:12 浏览: 86
好的,可以使用 C 语言来实现这道题,和之前的 Python 实现思路类似,使用双指针来遍历两个有序链表,比较节点的值大小,将相同的节点添加到一个新的链表中。
以下是 C 语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode* next;
};
struct ListNode* merge_sorted_lists(struct ListNode* A, struct ListNode* B) {
struct ListNode* dummy_head = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy_head->val = 0;
dummy_head->next = NULL;
struct ListNode* tail = dummy_head;
struct ListNode* p1 = A;
struct ListNode* p2 = B;
while(p1 && p2) {
if(p1->val == p2->val) {
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail = tail->next;
tail->val = p1->val;
tail->next = NULL;
p1 = p1->next;
p2 = p2->next;
} else if(p1->val < p2->val) {
p1 = p1->next;
} else {
p2 = p2->next;
}
}
return dummy_head->next;
}
int main() {
struct ListNode* A = (struct ListNode*)malloc(sizeof(struct ListNode));
A->val = 1;
A->next = (struct ListNode*)malloc(sizeof(struct ListNode));
A->next->val = 3;
A->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
A->next->next->val = 4;
A->next->next->next = NULL;
struct ListNode* B = (struct ListNode*)malloc(sizeof(struct ListNode));
B->val = 2;
B->next = (struct ListNode*)malloc(sizeof(struct ListNode));
B->next->val = 3;
B->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
B->next->next->val = 5;
B->next->next->next = NULL;
struct ListNode* C = merge_sorted_lists(A, B);
while(C) {
printf("%d ", C->val);
C = C->next;
}
return 0;
}
```
首先定义了一个链表节点 `struct ListNode`,包含 `val` 和 `next` 两个成员变量,分别表示节点的值和指向下一个节点的指针。然后定义了 `merge_sorted_lists` 函数,接收两个有序链表 A 和 B 作为输入,返回一个新的链表 C,其中的元素为 A 和 B 中元素的交集,并且按照元素值递增有序排列。函数先创建一个虚拟头节点 `dummy_head`,然后定义一个指针 `tail` 指向链表 C 的尾部。接着,定义两个指针 `p1` 和 `p2`,分别指向链表 A 和链表 B 的头节点。在循环中,比较 `p1` 和 `p2` 所指向的节点的元素值大小,如果两个元素值相等,则将这个节点的元素插入到链表 C 的尾部,并将 `p1` 和 `p2` 同时后移;如果其中一个元素值比另一个小,则将指向该元素值的指针后移,直到找到两个元素值相等的节点或者其中一个链表遍历完毕。最后返回虚拟头节点的下一个节点,即链表 C 的头节点。
在 `main` 函数中创建两个有序链表 A 和 B,然后调用 `merge_sorted_lists` 函数得到一个新的链表 C,输出 C 中的元素值。
注意:在 C 语言中,需要手动释放动态分配的内存,以避免内存泄漏。
阅读全文