设有两个单链表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
代码实现(C语言)
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;
p_a=A;
q_a=A;
r_a=A;
p_b=B;
r_b=B;
while(A->next)
{
A=A->next;
sum_a++;
}
while(B->next)
{
B=B->next;
sum_b++;
}
B=r_b;
A->next=B->next;
A=r_a;
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)
{
data_a=p_a->data;
p_a->data=q_a->data;
q_a->data=data_a;
}
}
}
return A;
}