这个问题可以两部分组成:
1、首席判读链表是否有环;
2、有环的话,在公共点拆开:设在ptr1 == ptr2 ,那么ptr2前进一步:ptr2 = ptr2->next;ptr1拆链表:ptr1->next = NULL;
此时,就有两个链表了:一个是原来的链表list1,在ptr1处结束;一个是以ptr1为头节点的新链表list2。于是问题转换成为了list1与list2的第一个公共节点。此问题已经解决。
代码实现如下:
# include <stdio.h> # include <malloc.h> typedef struct LNode{ int data; struct LNode *next; }LNode, *LinkList; /** * 采用数组a[]来初始化链表,数组的长度为length;head指向了头节点。 */ LinkList CreatList(int a[], int length) { LinkList head = (LinkList)malloc(sizeof(LNode)); head->next = NULL; int index; LinkList temp; for (index = 0; index < length; index ++) { temp = (LinkList)malloc(sizeof(LNode)); temp->data = a[index]; temp->next = head->next; head->next = temp; } return head; } /** * 判断链表list1与链表list2是否相交,如果相交的话,就返回第一个相交点 * 注意相交的话,就是横着的Y字型 */ int isIntersect(LinkList list1, LinkList list2) { LinkList ptr1 = list1->next; LinkList ptr2 = list2->next; int len1 = getLength(list1); int len2 = getLength(list2); int step = len1 - len2; int index; if(step > 0) //list1长,那么list1先走step; { for (index = 0; index < step; index ++) ptr1 = ptr1->next; } else //list2长,那么list2先走step; { for (index = 0; index < -1 * step; index ++) ptr2 = ptr2->next; } while (ptr1 != NULL) { if (ptr1 == ptr2) { printf("the first intersection node is %d/n", ptr1->data); return 1; } ptr1 = ptr1->next; ptr2 = ptr2->next; } printf("there is no insection node between the two list"); return 0; } /** * 如果链表有环,那么返回第一个入环的节点 */ int getLoopNode(LinkList list) { LinkList current = list->next; LinkList ptr1 = current; LinkList ptr2 = current; while (ptr2 != NULL) { ptr1 = ptr1->next; // ptr2 = ptr2->next->next; ptr2 = ptr2->next; if (ptr2 == NULL) return 0; else ptr2 = ptr2->next; if (ptr1 == ptr2) { ptr2 = ptr1->next; ptr1->next = NULL; LinkList begin = (LinkList)malloc(sizeof(LNode)); //begin为新链表,包含头节点; begin->next = ptr2; isIntersect(list, begin); return 1; } } return 0; } int main() { int a4[] = {1,2,3,4,5}; LinkList list = CreatList(a4,5); LinkList current = list->next; while (current->next) { current = current->next; } current->next = list->next->next; //一个环为4 getLoopNode(list); }