题目一:假设有两个按元素值递增有序排列的线性表 A 和 B,均以单链表作存储结构,请编写算法将 A 表和 B 表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表 C,并要求利用原表(即 A 表和 B 表)的结点空间构造 C 表。
算法:谁的值小谁就先插入链表C中,插入时用头插法插入,最后就是递减有序
void Merge(LinkList A, LinkList B, LinkList C)
{
assert(A != NULL && B != NULL && C!= NULL);
Node* pa = A->next;//指向链表A的第一个节点
Node* pb = B->next;//指向链表B的第一个节点
Node* qa = pa->next;
Node *qb=pb->next;
//当链表A和B都有数据时
while (pa != NULL && pb != NULL)
{
//记录原链中pa,pb的下一个节点
qa = pa->next;
qb = pb->next;
if (pa->data < pb->data)
{
pa->next = C->next;
C->next = pa;
pa = qa;
}
else if (pa->data == pb->data)
{
pa->next = C->next;
C->next = pa;
pa = qa;
pb = qb;
}
else
{
pb->next = C->next;
C->next = pb;
pb = qb;
}
}
//当链表A中还有数据时
while (pa!= NULL)
{
qa = pa->next;
pa->next = C->next;
C->next = pa;
pa = qa;
}
//当链表B中还有数据时
while (pb!= NULL)
{
qb = pb->next;
pb->next = C->next;
C->next = pb;
pb = qb;
}
}
题目二:已知递增有序的单链表 A,B 和 C 分别存储了一个集合,设计算法实现 A:=A∪(B∩C),
并使求解结构 A 仍保持递增。要求算法的时间复杂度为 O(|A|+|B|+|C|)。其中,|A|为集合A 的元素个数
void Union(LinkList A, LinkList B, LinkList C)
{
assert(A != NULL && B != NULL && C != NULL);
Node* pa = A->next;//指向链表A的第一个节点
Node* pb = B->next;//指向链表B的第一个节点
Node* pc = C->next;//指向链表C的第一个节点
while (pb != NULL && pc != NULL)
{
if (pb->data < pc->data)
{
pb = pb->next;
}
else if (pb->data > pc->data)
{
pc = pc->next;
}
else
{
while (pa->data < pb->data)
{
pa = pa->next;
}
if (pa->data == pb->data)
{
pa = pa->next;
pb = pb->next;
pc = pc->next;
continue;
}
else
{
//找到前驱
Node* q = SearchPrio(A, pa->data);
//函数SearchPrio()可参考前一篇博客
if (q == NULL)
return;
Node* p = (Node*)malloc(sizeof(Node));
p->data = pb->data;
p->next = q->next;
q->next = p;
pb = pb->next;
pc = pc->next;
}
}
}
}