条件也可改为“要求空间复杂度O(1)”。
代码如下,欢迎大佬指正。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}Node,*Link;
//初始化一个链表
void Init(Link& link)
{
link = (Link)malloc(sizeof(Node));
link->next = NULL;
}
//创建一个链表
void Input(Link& link)
{
Node* p = link,*s;
int x;
scanf("%d", &x);
while (x<9999)//9999即以上的值表示退出循环
{
s = (Node*)malloc(sizeof(Node));
s->data = x;
p->next = s;
p = s;
scanf("%d", &x);
}
p->next = NULL;
}
//头插法,将p结点插入到头结点link的后面,并返回p的下一个结点,防止断链
Node* F2(Link& link, Node* p)
{
Node* s = p->next;
p->next = link->next;
link->next = p;
return s;
}
//将两个升序线性表,用头插法合并成一个降序线性表
void Func(Link& a, Link& b)
{
Node* p = a->next,*q=b->next;
a->next = NULL;
while (p != NULL && q != NULL)
{
if (p->data < q->data)
p = F2(a, p);
else
q = F2(a, q);
}
//处理剩余部分,两个while循环最多只会执行一个
//若p不为空,表明p结点及其接下来的结点都比链表b的所有结点的值大或等于
while (p != NULL)
p = F2(a, p);
while (q != NULL)
q = F2(a, q);
free(b);
}
//输出链表
void PrintLink(Link link)
{
Node* p = link;
while (p->next != NULL)
{
printf("%d ", p->next->data);
p = p->next;
}
}
int main()
{
Link a,b;
Init(a);
Init(b);
Input(a);
Input(b);
Func(a, b);
PrintLink(a);
return 0;
}