解题思路:
如果存在交点,两个链表在交点及其之后的部分是一致的-----这点很关键,一致的意思包括两部分:长度和容。
- struct Node
- {
- int data;
- struct Node * next;
- };
- Node* FixIntersetion(Node* pHead1, Node* pHead2)
- {
- Node* p1 = pHead1;
- Node* p2 = pHead2;
- int i = 1, j = 1, k = 0, diff = 0;
- //如果都是空链表,肯定没有交点
- if(pHead2 == NULL || pHead2 == NULL)
- {
- return NULL;
- }
- //获取链表长度
- while(p1->next != NULL)
- {
- p1 = p1->next;
- i++;
- }
- while(p2->next != NULL)
- {
- p2 = p2->next;
- j++;
- }
- //开始判断是否存在交点
- if(p1 != p2)
- {//根据有交点时,两个链表在交点及其之后的部分是公共的,因此,有交点的单链表的尾节点必定相同
- return NULL; //如果尾节点不同,直接返回NULL
- }
- else //否则寻找第一个相同的节点
- {
- p1=pHead1;
- p2=pHead2;
- //使得两者的起始比较位置离尾部的长度一致
- if(i>j)
- {
- diff=i-j;
- for(k=0; k<diff; k++)
- {
- p1 = p1->next;
- }
- }
- if(i<j)
- {
- diff=j-i;
- for(k=0; k<diff; k++)
- {
- p2 = p2->next;
- }
- }
- //开始比对,得出交点
- while(p1 != p2)
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- return p1;
- }
- }