2. 假设有两个按数据元素值递增有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)结点空间存放表C。
时间: 2024-02-25 17:57:34 浏览: 143
算法如下:
1. 定义三个指针,分别指向A、B、C表的当前结点,初始时分别指向A、B、NULL。
2. 循环执行以下步骤,直到A、B表中任意一个为空:
1. 比较A、B当前结点的值,将值较大的结点插入到C表中,同时该指针向后移动一位。
2. 如果A、B当前结点的值相等,则任选一个插入到C表中,同时两个指针都向后移动一位。
3. 如果A表中还有结点未插入到C表中,则将剩余的结点全部插入到C表中。
4. 如果B表中还有结点未插入到C表中,则将剩余的结点全部插入到C表中。
5. 最后将C表逆序,即为按元素值递减有序排列的线性表。
代码实现如下:
```
void mergeList(ListNode* A, ListNode* B, ListNode*& C) {
ListNode* pa = A->next;
ListNode* pb = B->next;
C = NULL;
while (pa != NULL && pb != NULL) {
if (pa->val >= pb->val) {
ListNode* node = pa;
pa = pa->next;
node->next = C;
C = node;
} else {
ListNode* node = pb;
pb = pb->next;
node->next = C;
C = node;
}
}
while (pa != NULL) {
ListNode* node = pa;
pa = pa->next;
node->next = C;
C = node;
}
while (pb != NULL) {
ListNode* node = pb;
pb = pb->next;
node->next = C;
C = node;
}
// 逆序C表
ListNode* pre = NULL;
ListNode* cur = C;
while (cur != NULL) {
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
C = pre;
}
```
阅读全文
相关推荐


















