链表基础题③

268 阅读1分钟

这是我参与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;
	
}

15.找两个递增的链表的交集

思路:二路归并(

图片.png

16.判断序列B是不是A的子序列

思路:B一直重复,A一直往前走,用来找公共的节点

图片.png

17.判断是否是 回文链表

思路:两边来回判断

图片.png