11.已知A、B是两个递增有序的单链表,设计算法利用原表结点空间将其合并为一个递增有序的链表
LinkList T_11(LinkList *A,LinkList *B){ //选取AB中较小的结点,尾插法插入C中
LinkList pa=A->next;
LinkList pb=B->next;
LinkList C=(LinkList *)malloc(sizeof(LinkList)); //创建带头结点的链表C
C->next=NULL;
LinkList q=C; //q为指向C尾结点的指针
while(pa!=NULL&&pb!=NULL){
if(pa->data>pb->data){ //pb所指结点值小于pa,向C中插入pb所指结点
q->next=pb;
pb=pb->next;
q=q->next;
}
else if(pa->data<pb->data){ //pa所指结点的值小于pb所指结点值,向C中插入pa所指结点
q->next=pa;
pa=pa->next;
q=q->next;
}
else{ //pa、pb所指结点值相同,插入一个即可,pa,pb均向后移动
q->next=pb;
pb=pb->next;
q=q->next;
pa=pa->next;
}
}
if(pa==NULL&&pb!=NULL){ //若A为空,则把B所剩结点插入到C中
q->next=pb;
}
if(pb==NULL&&pa!=NULL){ //若B为空,则把A所剩结点插入到C中
q->next=pa;
}
return C;
}
12.已知A、B是两个递增有序的单链表,设计算法利用原结点空间将其合并为一个递减有序的链表C,时间复杂度为O(|A|+|B|)
LinkList T_12(LinkList *A,LinkList *B){ //选取AB中较小的结点,头插法插入C中
LinkList pa=A->next;
LinkList pb=B->next;
LinkList r;
LinkList C=(LinkList *)malloc(sizeof(LinkList)); //创建带头结点的链表C
C->next=NULL;
while(pa!=NULL&&pb!=NULL){
if(pa->data>pb->data){ //pb所指结点值小于pa,向C中插入pb所指结点
r=pb;
pb=pb->next;
r->next=C->next; //把r以头插法插入C
C->next=r;
}
else if(pa->data<pb->data){ //pa所指结点的值小于pb所指结点值,向C中插入pa所指结点
r=pa;
pa=pa->next;
r->next=C->next; //把r以头插法插入C
C->next=r;
}
else{ //pa、pb所指结点值相同,插入一个即可,pa,pb均向后移动
r=pa;
pa=pa->next;
r->next=C->next; //把r以头插法插入C
C->next=r;
pb=pb->next;
}
}
while(pa==NULL&&pb!=NULL){ //若A为空,则把B所剩结点插入到C中
r=pb;
pb=pb->next;
r->next=C->next;
C->next=r;
}
while(pb==NULL&&pa!=NULL){ //若B为空,则把A所剩结点插入到C中
r=pa;
pa=pa->next;
r->next=C->next;
C->next=r;
}
return C;
}