leetcode 160.链表相交:暴力哈希表法

         使用取余和链表法,先将链表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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值