转自:
判断两个链表是否有公共节点的方法最简单的就是遍历到每个链表的最后一个节点,看他们是否是同一个节点:如果是同一个节点的话,那么两个链表肯定有公共节点:
解释:因为链表是线性结构,不想树那样的非线性分叉结构
typedef struct LNode{ int data; struct LNode *next; }LNode, *LinkList;
一个链表有唯一的一个后序节点:如果两个链表中出现了公共节点,那么从该点开始,后面的节点都是公共的,肯定链表的最后一个节点也是公共的。于是不管三七二十一,遍历到最后链表的一个节点,判断两个节点是不是同一个节点就可以了。
但是这里我们要返回第一个公共节点,所以还得寻去他法:
1.如果两个链表有长度一样,我们从第一个逐个遍历节点,再比较是不是同一个节点就可以了;
2.如果两个链表长度不一样,我们应该先让长的链表从表头“走” len1 - len2步(len1为list1的长度,len2为list2的长度),然后按照1中方法进行操作即可。
# include# include 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 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 int result1 = isLoop(list); getLoopNode(list); }