写一个算法,已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用户求出A和B的差集(即仅由在A中出现而在B中不出现的元素构成的集合),并用递增的方式保存在表A中,同时返回该集合的元素数目
时间: 2023-05-14 09:05:00 浏览: 114
已知有两个按元素值递增有序的顺序表A和B,设计一个算法将表A和表B的全部元素归并为一个按元素值递增有序的顺序表C。
5星 · 资源好评率100%
以下是算法的实现:
1. 定义两个指针pA和pB,分别指向链表A和B的头节点。
2. 定义一个指针pPrev,指向链表A中最后一个出现在B中的元素的前一个元素(初始值为NULL)。
3. 遍历链表A和B,比较pA和pB指向的元素大小:
a. 如果pA指向的元素小于pB指向的元素,则将pA指向下一个元素。
b. 如果pA指向的元素大于pB指向的元素,则将pB指向下一个元素。
c. 如果pA指向的元素等于pB指向的元素,则将pPrev指向pA,并将pA和pB都指向下一个元素。
4. 遍历链表A,将所有不在B中出现的元素插入到pPrev之后,并更新pPrev的值。
5. 返回集合的元素数目,即链表A的长度。
以下是算法的C++代码实现:
int getDifference(ListNode* A, ListNode* B) {
ListNode* pA = A;
ListNode* pB = B;
ListNode* pPrev = NULL;
int count = 0;
while (pA != NULL && pB != NULL) {
if (pA->val < pB->val) {
pPrev = pA;
pA = pA->next;
} else if (pA->val > pB->val) {
pB = pB->next;
} else {
pPrev = pA;
pA = pA->next;
pB = pB->next;
}
}
while (pA != NULL) {
if (pPrev == NULL || pPrev->val != pA->val) {
ListNode* node = new ListNode(pA->val);
node->next = pPrev->next;
pPrev->next = node;
pPrev = node;
count++;
}
pA = pA->next;
}
return count;
}
阅读全文