指针

  1. C语言中指针的输出格式为%p。
  2. linux中如何查看版本和是32位还是64位,uname -a
  3. C语言中*运算符的优先级和&运算符的优先级相等,自右向左。


           4.  scanf函数和printf函数

           5.  求相交链表的交点,带环相交,不带环相交,单链表

           6. 求带环链表的环入口


           7.  判断两个单链表是否相交

   

#include<stdio.h>



struct Node{

	int num;

	int data;

	struct Node* next;

};

typedef struct Node Node;



Node* findCrossNode(Node* head1, Node* head2){

	Node *fast1 = head1, *fast2 = head2, *slow1 = head1, *slow2 = head2;

	Node *ptr1, *ptr2, *ptr, *hptr;

	int hasCir1 = 0, hasCir2 = 0, len1, len2, len;

	

	if(head1 == NULL || head2 == NULL)

		return NULL;



	while(fast1 && fast1 -> next){

		slow1 = slow1 -> next;

		fast1 = fast1 -> next -> next;

		if(slow1 == fast1){

			hasCir1 = 1;

			break;

		}

	}

	

	if(hasCir1){

		ptr1 = head1;

		while(ptr1 != slow1){

			ptr1 = ptr1 -> next;

			slow1 = slow1 -> next;

		}

	}



	printf("hasCir1: %d\n", hasCir1);

	if(ptr1)

		printf("cross1: %d\n", ptr1->num);	

	while(fast2 && fast2 -> next){

		slow2 = slow2 -> next;

		fast2 = fast2 -> next -> next;

		if(slow2 == fast2){

			hasCir2 = 1;

			break;

		}

	}

	

	if(hasCir2){

		ptr2 = head2;

		while(ptr2 != slow2){

			ptr2 = ptr2 -> next;

			slow2 = slow2 -> next;

		}

	}

	

	printf("hasCir2: %d\n", hasCir2);

	if(ptr2)

		printf("cross2: %d\n", ptr2->num);

	if(hasCir1 && hasCir2){

		if(ptr1 != ptr2){

			return ptr1;//或者返回ptr2

		}else{

			for(len1 = 1, ptr = head1; ptr != ptr1; ptr = ptr -> next, len1 ++);

			for(len2 = 1, ptr = head2; ptr != ptr1; ptr = ptr -> next, len2 ++);

			if(len1 >= len2){

				for(len = 1, ptr = head1; len <= len1 - len2; ptr = ptr -> next, len ++);

				hptr = head2;

				while( ptr != hptr){

					ptr = ptr -> next;

					hptr = hptr -> next;

				}

				return ptr;

			}else if(len1 < len2){

				for(len = 1, ptr = head2; len <= len2 - len1; ptr = ptr -> next, len ++);

				hptr = head1;

				while( ptr != hptr){

					ptr = ptr -> next;

					hptr = hptr -> next;

				}

				return ptr;

			}

		}

	}

	

	if(!hasCir1 && !hasCir2){

		for(len1 = 0, ptr = head1; ptr != NULL; ptr = ptr -> next, len1 ++);

		for(len2 = 0, ptr = head2; ptr != NULL; ptr = ptr -> next, len2 ++);

		if(len1 >= len2){

			for(len = 1, ptr = head1; len <= len1 - len2; ptr = ptr -> next, len ++);

				hptr = head2;

				while( ptr != hptr){

					ptr = ptr -> next;

					hptr = hptr -> next;

				}

				return ptr;

			}else if(len1 < len2){

				for(len = 1, ptr = head2; len <= len2 - len1; ptr = ptr -> next, len ++);

				hptr = head1;

				while( ptr != hptr){

					ptr = ptr -> next;

					hptr = hptr -> next;

				}

				return ptr;

			}

	}

	return NULL;	

}



int main(){

	Node a, b, c, d, e;

	a.num = 1;

	b.num = 2;

	c.num = 3;

	d.num = 4;

	e.num = 5;

	a.next =  &b;

	b.next =  &c;

	c.next =  &d;

	d.next =  NULL;

	e.next =  NULL;



	Node *crossNode = findCrossNode(&a, &e);

	if(crossNode){	

		printf("The cross Node is %d\n", crossNode->num);

	}else{

		printf("The Cross Node is NULL\n");

	}

	return 0;

}

     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值