用c++设计算法将两个递增有序的带头结点的单链表A、B合并为一个递减有序的带头结点的单链表,并要求算法的时间复杂度为两个表长之和的数量级。并对代码进行注释
时间: 2024-05-13 18:14:21 浏览: 77
算法思路:
1. 定义三个指针:`p`指向A链表的头结点,`q`指向B链表的头结点,`r`指向结果链表的头结点。
2. 比较`p`和`q`所指向结点的值的大小,将较小值的结点接在结果链表的后面。
3. 重复2直到有一个链表为空。
4. 将剩余非空链表中的结点依次接在结果链表的后面。
5. 返回结果链表的头结点。
代码实现及注释:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node, *LinkList;
// 创建链表,头插法
LinkList createList(int n) {
LinkList head = (LinkList)malloc(sizeof(Node)); // 创建头结点
head->next = NULL;
for (int i = 0; i < n; i++) {
Node *p = (Node*)malloc(sizeof(Node));
scanf("%d", &(p->data));
p->next = head->next;
head->next = p;
}
return head;
}
// 合并两个递增有序的带头结点的单链表A、B为一个递减有序的带头结点的单链表
LinkList mergeList(LinkList A, LinkList B) {
Node *p = A->next, *q = B->next; // 指向A、B链表的第一个数据节点
A->next = NULL; // 将A链表改为递减有序
while (p && q) {
if (p->data < q->data) { // 如果A链表的当前结点的值小于B链表的当前结点的值
Node *tmp = p->next; // 保存A链表的下一个结点
p->next = A->next; // 将A链表的当前结点插入到结果链表的头部
A->next = p;
p = tmp; // 移动A链表的指针
} else {
Node *tmp = q->next; // 保存B链表的下一个结点
q->next = A->next; // 将B链表的当前结点插入到结果链表的头部
A->next = q;
q = tmp; // 移动B链表的指针
}
}
if (p) { // 将A链表剩余结点插入结果链表的头部
p->next = A->next;
A->next = p;
}
if (q) { // 将B链表剩余结点插入结果链表的头部
q->next = A->next;
A->next = q;
}
return A;
}
// 打印链表
void printList(LinkList head) {
Node *p = head->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int n, m;
printf("请输入链表A的长度:");
scanf("%d", &n);
LinkList A = createList(n);
printf("请输入链表B的长度:");
scanf("%d", &m);
LinkList B = createList(m);
LinkList C = mergeList(A, B);
printf("合并后的链表C为:");
printList(C);
return 0;
}
```
阅读全文