使用取余和链表法,先将链表A存入表,再遍历链表B,在表中对比。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#define HashLen 100
struct Hash
{
struct ListNode *node;
struct Hash *next;
};
struct Hash HashTable[HashLen];
void HashSave(struct ListNode *SaveNode)
{
int offset;
struct Hash *CheckPoint, *NewPoint;
if(SaveNode == NULL)
return;
offset = SaveNode->val % HashLen;
CheckPoint = &HashTable[offset];
while(CheckPoint->next != NULL)
{
CheckPoint = CheckPoint->next;
}
NewPoint = (struct Hash*)malloc(sizeof(struct Hash));
CheckPoint->next = NewPoint;
NewPoint->node = SaveNode;
NewPoint->next = NULL;
}
struct ListNode *HashSearch(struct ListNode *SearchNode)
{
int offset;
struct Hash *CheckPoint;
struct ListNode* pReturn;
offset = SearchNode->val % HashLen;
CheckPoint = HashTable[offset].next;
if(CheckPoint == NULL)
return NULL;
do{
if(CheckPoint->node == SearchNode)
{
pReturn = SearchNode;
return pReturn;
}
CheckPoint = CheckPoint->next;
}while(CheckPoint != NULL);
return NULL;
}
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *pReturn, *pWork;
pReturn = NULL;
if(headA == NULL || headB == NULL)
return pReturn;
pWork = headA;
while(pWork != NULL) //把链表A存入哈希表
{
HashSave(pWork);
pWork = pWork->next;
}
pWork = headB;
while(pWork != NULL) //遍历链表B,在哈希表里查找
{
pReturn = HashSearch(pWork);
if(pReturn != NULL)
break;
pWork = pWork->next;
}
return pReturn;
}