设有两个单链表A、B,其中元素递增有序,本题要求实现一个函数merge(LinkList A, LinkList B),将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。。
函数接口定义:
LinkList merge(LinkList A, LinkList B);
其中 A
和 B
都是用户传入的参数。 A
是单链表A的头指针; B
是单链表B的头指针。函数须返回单链表C的头指针。
裁判测试程序样例:
#define FLAG -1
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}LNode, *LinkList;
LinkList Creat_LinkList();/*这里忽略函数的实现*/
LinkList merge(LinkList A, LinkList B);
void Print_LinkList(LinkList L);/*这里忽略函数的实现*/
int main()
{
LinkList L,L1,L2;
L1 = Creat_LinkList();
if(L1 == NULL)
{
printf("L1=NULL,error!");
return 0;
}
L2 = Creat_LinkList();
if(L2 == NULL)
{
printf("L2=NULL,error!");
return 0;
}
L = merge(L1, L2);
Print_LinkList(L);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1 3 5 7 9 -1
2 4 6 8 8 10 -1
输出样例:
在这里给出相应的输出。例如:
10 9 8 8 7 6 5 4 3 2 1
参考代码
LinkList merge(LinkList A, LinkList B) {
int i, j, data_a, data_b, sum_a = 0, sum_b = 0;
LinkList p_a, q_a, r_a, p_b, q_b, r_b;
// 备份链表 A 的头节点到 p_a,q_a 和 r_a,以便后面使用
p_a = A;
q_a = A;
r_a = A;
// 备份链表 B 的头节点到 p_b,r_b,以便后面使用
p_b = B;
r_b = B;
// 计算链表 A 的节点数量,存储在 sum_a 中
while (A->next) {
A = A->next;
sum_a++;
}
// 计算链表 B 的节点数量,存储在 sum_b 中
while (B->next) {
B = B->next;
sum_b++;
}
// 将链表 B 的尾部节点连接到链表 A 的尾部
B = r_b;
A->next = B->next;
A = r_a;
// 使用冒泡排序合并链表 A 和 B 中的元素
for (i = 0; i < sum_a + sum_b; i++) {
p_a = p_a->next;
q_a = p_a;
for (j = i + 1; j < sum_a + sum_b; j++) {
q_a = q_a->next;
if (q_a->data >= p_a->data) {
// 如果链表 B 中的元素大于链表 A 中的元素,交换它们的值
data_a = p_a->data;
p_a->data = q_a->data;
q_a->data = data_a;
}
}
}
return A; // 返回合并后的链表 A
}