这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战
链表基础题 三
13.将两个递增链表合并为一个递减链表
思路:同时移动两个指针将较小元素节点的存入链表
LinkList MergeList(LinkList &La,LinkList &Lb){
LNode *r,*pa=La->next,*pb=Lb->next; //分别指向两个链表
La->next = NULL; //La作为结果链表的头指针
while(pa && pb){
if(pa->data <= pb->data){
r = pa->next;
pa->next = La->next;
La->next = pa; //头插逆置 为了维护递减
pa = r; //恢复pa的位置
}else{
r = pa->next;
pb->next = La->next;
La->next = pb; //头插逆置 为了维护递减
pb = r; //恢复pb的位置
}
if(pa){
pb = pa; //处理非空链表
}
while(pb){ //依次头插到La中
r = pb->next;
pb->next = La->next;
La->next = pb;
pb = r;
}
free(Lb);
}
}
14.A、B为递增链表,找到公共部分,产生C链表
思路:两个指针一起走,谁小谁先走,找到公共节点再继续走
LinkList GetComm(LinkList A,LinkList B){
LNode *p=A->next,*q=B->next,*r,*s //分别指向两个链表
LinkList C = (LinkList)malloc(sizeof(LNode));
r = c; //r始终指向c的尾巴
while(p!=NULL && q!+NULL){ //谁小 谁先走
if(p->data < p->data){
p = p->next;
}else if(p->data > p->data){
q = q->next;
}else{
s = (LNode*)malloc(sizeof(LNode));
s->data = p->data; //复制p数值
r->next = s; //尾插到C上
r = s;
p = p->next; //继续走
q = q->next;
}
r->next = NULL;
}