题目:输入两个单链表。找出公共结点。
思路:若两个单链表有公共结点。其形状必然为“Y”型,也就是说公共结点后的全部结点都是同样的。
我们首先获得两个链表的长度。求得长度之差为n,再定义两个指针分别指向两个链表首部,长链表先走n步,然后两个指针同一时候走,直到两个指针所指向的值全然同样时停止。
代码:
/* 求链表公共结点 */ #include<stdio.h> #include<stdlib.h> typedef struct _NODE_ { int data; struct _NODE_ *next; }Node,*pNode; int get_length(pNode list) { if(list == NULL) { return 0; } int len = 0; pNode pTemp = list; while(pTemp != NULL) { len++; pTemp = pTemp->next; } return len; } void create(pNode *list,int n) { if(n <= 0) { return; } *list = (pNode)malloc(sizeof(Node)); if(!list) { exit(-1); } int data; scanf("%d",&data); (*list)->data = data; (*list)->next = NULL; pNode pTemp = *list; for(int i = 0; i < n-1; i++) { scanf("%d",&data); pNode pNew = (pNode)malloc(sizeof(Node)); if(!pNew) { exit(-1); } pNew->data = data; pNew->next = NULL; pTemp->next = pNew; pTemp = pNew; } } //求单链表公共结点 pNode FindCommonNode(pNode list1,pNode list2) { if(list1 == NULL || list2 == NULL) { return NULL; } int len1 = get_length(list1); int len2 = get_length(list2); int dif = len1 - len2; pNode pLong = list1; pNode pShort = list2; if(dif < 0) { pLong = list2; pShort = list1; dif = len2-len1; } while(dif > 0) { pLong = pLong->next; dif--; } while(pLong != NULL && pShort != NULL && pLong != pShort) { pLong = pLong->next; pShort = pShort->next; } return pLong; } void Destroy(pNode *list) { if(*list == NULL) { return; } pNode p = *list,q; while(p != NULL) { q = p->next; free(p); p = q; } }
版权声明:本文博客原创文章。博客,未经同意,不得转载。