写一个C语言代码,实现数据结构当中有序链表的并交差
时间: 2024-09-27 10:06:10 浏览: 32
C语言 数据结构之链表实现代码
5星 · 资源好评率100%
在C语言中,我们可以分别编写函数来实现有序链表的合并(Merge)、查找公共元素(Intersection),以及查找两个链表是否有交集(Crossing)。这里我们首先定义一个简单的链表节点结构:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 插入排序链表
void insertSortList(ListNode** head) {
if (*head == NULL || (*head)->next == NULL) return;
ListNode *cur = *head;
while (cur->next != NULL && cur->next->val < cur->val) {
ListNode *temp = cur->next;
cur->next = temp->next;
temp->next = cur;
cur = temp;
}
*head = cur;
}
// 合并两个已排序链表
ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
if (l1->val <= l2->val) {
l1->next = mergeSortedLists(l1->next, l2);
return l1;
} else {
l2->next = mergeSortedLists(l1, l2->next);
return l2;
}
}
// 查找两个链表的公共部分
ListNode* findIntersection(ListNode* list1, ListNode* list2) {
ListNode *ptr1 = list1, *ptr2 = list2;
while (ptr1 != ptr2) {
ptr1 = (ptr1 ? ptr1->next : list2); // 如果ptr1为空,则从list2开始搜索
ptr2 = (ptr2 ? ptr2->next : list1); // 如果ptr2为空,则从list1开始搜索
}
return ptr1;
}
// 判断两链表是否有交叉点
int isCrossing(ListNode* l1, ListNode* l2) {
if (l1 == NULL || l2 == NULL) return 0; // 空链表之间无交叉
ListNode *p1 = l1->next, *p2 = l2->next;
while (p1 != l2 && p2 != l1) { // 如果它们相遇,说明有交叉
if (p1 == p2) return 1;
p1 = (p1 ? p1->next : l2);
p2 = (p2 ? p2->next : l1);
}
return (p1 == l2 || p2 == l1); // 如果其中一个到达了另一个的起始位置,说明有交叉
}
// 测试示例
int main() {
// 实现链表并创建测试数据
// ...
// 调用上述函数
// ...
return 0;
}
```
在这个代码中,`insertSortList`用于对链表进行插入排序,`mergeSortedLists`负责合并两个已经排好序的链表,`findIntersection`寻找两个链表的交集,`isCrossing`判断两个链表是否有交叉点。
阅读全文