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

版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/83243456

题目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 

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/83243456