用有序链表写一个集合的交、并、差运算的算法
时间: 2024-05-01 17:19:31 浏览: 81
集合的并、交和差运算的算法.docx
好的,我知道了。关于您的问题,我可以提供如下的实现思路:
首先,我们需要定义一个有序链表的结构体,包含节点值和指向下一个节点的指针。
```c
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
```
有序链表是按照从小到大的顺序排序的,所以我们可以通过比较两个链表当前节点的值的大小来实现集合的交、并、差运算。
1. 集合的交运算:
遍历两个有序链表,如果它们的当前节点值相等,则把该节点值加入新的链表中,然后两个链表的指针均向后移动一位;否则,将节点值较小的链表的指针向后移动一位。
```c
ListNode* intersection(ListNode* l1, ListNode* l2) {
ListNode* res = NULL, *tail = NULL;
while (l1 && l2) {
if (l1->val == l2->val) {
if (!res) {
res = new_node(l1->val);
tail = res;
} else {
tail->next = new_node(l1->val);
tail = tail->next;
}
l1 = l1->next;
l2 = l2->next;
} else if (l1->val < l2->val) {
l1 = l1->next;
} else {
l2 = l2->next;
}
}
return res;
}
```
2. 集合的并运算:
遍历两个有序链表,把它们当前节点值中较小的那个加入新的链表中,然后指针向后移动一位,直到其中一个链表为空时,把另一个链表的剩余部分加入新的链表中。
```c
ListNode* merge(ListNode* l1, ListNode* l2) {
ListNode* res = NULL, *tail = NULL;
while (l1 && l2) {
if (l1->val <= l2->val) {
if (!res) {
res = new_node(l1->val);
tail = res;
} else {
tail->next = new_node(l1->val);
tail = tail->next;
}
l1 = l1->next;
} else {
if (!res) {
res = new_node(l2->val);
tail = res;
} else {
tail->next = new_node(l2->val);
tail = tail->next;
}
l2 = l2->next;
}
}
if (l1) {
tail->next = l1;
}
if (l2) {
tail->next = l2;
}
return res;
}
```
3. 集合的差运算:
遍历两个有序链表,把节点值只存在一个链表中的加入新的链表中,然后指针向后移动一位,直到其中一个链表为空时,把另一个链表的剩余部分加入新的链表中。
```c
ListNode* diff(ListNode* l1, ListNode* l2) {
ListNode* res = NULL, *tail = NULL;
while (l1 && l2) {
if (l1->val == l2->val) {
l1 = l1->next;
l2 = l2->next;
} else if (l1->val < l2->val) {
if (!res) {
res = new_node(l1->val);
tail = res;
} else {
tail->next = new_node(l1->val);
tail = tail->next;
}
l1 = l1->next;
} else {
l2 = l2->next;
}
}
while (l1) {
tail->next = new_node(l1->val);
tail = tail->next;
l1 = l1->next;
}
return res;
}
```
以上就是用有序链表实现集合的交、并、差运算的算法,希望能对您有所帮助。
阅读全文