将两个递增的直线表合并成一个非递减直线表,要求利用原表的结点空间结构构造新表
时间: 2023-06-01 12:01:50 浏览: 180
将两个递增的链表合并为一个非递减的链表
5星 · 资源好评率100%
假设两个递增的直线表分别为A和B,它们的结点定义如下:
```
typedef struct node {
int data;
struct node *next;
} Node, *LinkedList;
```
则可以按照以下步骤将它们合并成一个非递减直线表:
1. 创建一个新的链表C,用于存储合并后的结果;
2. 分别遍历链表A和B,比较当前结点的值大小,将较小值的结点插入到链表C中;
3. 如果链表A或B已经遍历完了,将剩余的结点插入到链表C的尾部;
4. 返回链表C。
具体的代码实现如下:
```
LinkedList merge(LinkedList A, LinkedList B) {
Node *pa = A->next, *pb = B->next;
LinkedList C = (LinkedList)malloc(sizeof(Node));
C->next = NULL;
Node *pc = C;
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa;
pa = pa->next;
} else {
pc->next = pb;
pb = pb->next;
}
pc = pc->next;
}
if (pa) {
pc->next = pa;
}
if (pb) {
pc->next = pb;
}
return C;
}
```
其中,pa和pb分别表示链表A和B的当前结点,pc表示链表C的当前结点。如果pa的值小于等于pb的值,则将pa加入链表C中,否则将pb加入链表C中。随着遍历的进行,pc也不断向后移动。最后,如果链表A或B有剩余结点,将它们插入到链表C的尾部即可。
阅读全文