假设两个按元素值递增有序排列的线性表a和b,均以单链表作为存储结构,请编写算法,将a表和b表归并为一个按元素值递减有序排列的线性表c,并要求利用原表(即a表或b表的)结点空间存放c表。
时间: 2023-04-24 15:04:32 浏览: 178
算法步骤如下:
1. 定义三个指针p、q、r,分别指向a表、b表、c表的当前结点。
2. 比较p和q指向的结点的元素值,将较小的结点插入到c表的头部,并将指针后移。
3. 如果p或q指向的结点为空,则将另一个表中剩余的结点全部插入到c表的头部。
4. 最后将c表逆序,使其按元素值递减有序排列。
算法实现如下:
void mergeList(LinkList &a, LinkList &b, LinkList &c) {
// 定义三个指针p、q、r
Node *p = a->next, *q = b->next, *r;
// 初始化c表为空表
c = a;
c->next = NULL;
// 循环比较a表和b表的元素值
while (p != NULL && q != NULL) {
if (p->data < q->data) {
// 将p指向的结点插入到c表的头部
r = p->next;
p->next = c->next;
c->next = p;
p = r;
} else {
// 将q指向的结点插入到c表的头部
r = q->next;
q->next = c->next;
c->next = q;
q = r;
}
}
// 将a表或b表中剩余的结点全部插入到c表的头部
while (p != NULL) {
r = p->next;
p->next = c->next;
c->next = p;
p = r;
}
while (q != NULL) {
r = q->next;
q->next = c->next;
c->next = q;
q = r;
}
// 将c表逆序
Node *pre = NULL, *cur = c->next, *next;
while (cur != NULL) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
c->next = pre;
}
阅读全文