typedef struct SLnode
{
int data;
struct SLnode* next;
}SLnode,*SLnodelist;
SLnodelist merge(SLnodelist la,SLnodelist lb)
{
SLnodelist pa, pb;
pa = la->next;
pb = lb->next;
SLnodelist phead = la;
while (pa && pb)
{
if (pa->data <= pb->data)
{
SLnodelist ret = pa->next;
pa->next = NULL;
phead->next = pa;
phead = phead->next;
pa = ret;
}
else
{
SLnodelist pcur = pb->next;
pb->next = NULL;
phead->next = pb;
phead = phead->next;
pb = pcur;
}
}
phead->next = pa ? pa : pb;
return la;
}
int main()
{
SLnodelist la, lb;
int i = 0, n = 0, m = 0;
la = (SLnodelist)malloc(sizeof(SLnode));//la初始化哨兵位,头节点为空(data)
la->next = NULL;
lb = (SLnodelist)malloc(sizeof(SLnode));//lb初始化哨兵位,头节点为空(data)
lb->next = NULL;
SLnodelist a = la;
printf("请输入第一个链表的长度\n");
scanf("%d", &n);
printf("请输入第一个链表的元素\n");
for (i = 0; i < n; i++)
{
SLnodelist p1;
p1 = (SLnodelist)malloc(sizeof(SLnode));
scanf("%d", &p1->data);
p1->next = NULL;
a->next = p1;
a = a->next;
}
printf("\n");
SLnodelist b = lb;
printf("请输入第二个链表的长度\n");
scanf("%d", &m);
printf("请输入第二个链表的元素\n");
for (i = 0; i < m; i++)
{
SLnodelist p2;
p2 = (SLnodelist)malloc(sizeof(SLnode));
scanf("%d", &p2->data);
p2->next = NULL;
b->next = p2;
b = b->next;
}
la = merge(la, lb);//拿la的空间当新链表空间,因为题目要求不能格外第三方新建
SLnodelist ret = la->next;
while (ret)
{
printf("%d->", ret->data);
ret = ret->next;
}
printf("NULL\n");
return 0;
}
C语言版:将两个非递减的有序链表合并为一个非递增的有序链表。结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间
最新推荐文章于 2024-10-13 22:25:31 发布