题目14 归并链表,递减排列。两链表递增排列,要求利用原来节点存放归并后的单链表

题目14:归并链表,递减排列。两链表递增排列,要求利用原来节点存放归并后的单链表

void merge_ByDesc(Node *&a, Node *&b, Node *&n){
	//新链表递减排列,故可以采用头插法-假设均带头节点 
	Node *p=a->next, *q=b->next, *r, *m;
	r=n=a;
	r->next = NULL;
	free(b);
	while(p!=NULL and q!=NULL){
		if(p->num<q->num){
			m = p->next;
			p->next = r->next;
			r->next = p;
			p = m;
		}else{
			m = q->next;
			q->next = r->next;
			r->next = q;
			q = m;
		}
	} 
	while(p!=NULL){
		m = p->next;
		p->next = r->next;
		r->next = p;
		p = m;
	}
	while(q!=NULL){
		m = q->next;
		q->next = r->next;
		r->next = q;
		q = m;
	}
}

主函数:

         主函数中,不需要定义具体的头节点,有指针指向就可以了,void merge_ByDesc(Node *&a, Node *&b, Node *&n)函数中传入的是该指针的地址,故而可以修改其内容。

题目15:两链表,值相等的元素产生新链表,其中两链表递增有序

void find_SameNode(Node *a, Node *b, Node *&n){
	Node *p=n=(Node*)malloc(sizeof(Node)), *q;
	p->next = NULL;
	a = a->next;
	b = b->next;
	while(a!=NULL){        //这里的写法错误
		if(a->num<b->num){
			a = a->next; 
		}else if(a->num>b->num){
			b = b->next;
		}else{
			q=(Node*)malloc(sizeof(Node));
			q->num = a->num;
			q->next = p->next;
			p->next = q;
			p = q;
			a = a->next;
			b = b->next;
		}
	}
}

    错误的原因:如果数据是:a={100,200,300}  b={1,2,3}那么循环就会一直执行,所以这里的逻辑错误。应该是:while(a!=NULL and b!=NULL){}

题目16:链表AB,求交集,其中两链表递增有序,结果放入A中

 交集的结果存放在a中:

       小技巧:算法不宜直接使用一个指向a的指针,直接和b中的每个元素去判断,然后去删除不满足条件元素。而是采用定义一个新的逻辑的指针r为(虚拟第三个)新链表的头节点,然后去完成删除、加链操作。这样代码逻辑简单,不宜出错。编程的关键是理清代码的逻辑,然后表达。

void find_SameNode(Node *&a, Node *b){
	Node *p, *q, *r;
	r = a;
	p = a->next;
	r->next = NULL;
	b = b->next;
	while(b!=NULL and p!=NULL){
		if(p->num<b->num){
			q = p;
			p = p->next;
			free(q);
		}else if(p->num>b->num){
			b = b->next;
		}else{
			q = p;
			p = p->next;
			q->next = r->next;
			r->next = q;
			r = q;
			b = b->next;
		}
	}
	while(p!=NULL){
		q = p;
		p = p->next;
		free(q);
	}
	r->next = NULL;
}

 

作者:无涯明月 

志:将懒惰归结于迷茫,将不思进取归结为安于现状;是可悲还是可笑,亦或是可怕。

发文时间:2018-10-21 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值