力扣刷题-160.相交链表、217.存在重复元素

160.相交链表

题目

题解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

//哈希结构
typedef struct HashNode{
    struct ListNode * ptr;
    UT_hash_handle hh;
}HashNode,*HashTable;

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    //哈希表
    HashTable ht = NULL;
    struct ListNode * tempL = headA;
    while(tempL != NULL){
        //添加进哈希表
        HashNode* tempH = (HashNode*)malloc(sizeof(HashNode));
        tempH->ptr = tempL;
        HASH_ADD_PTR(ht,ptr,tempH);
        tempL = tempL->next;
    }
    tempL = headB;
    while(tempL != NULL){
        //查找哈希表
        HashNode* result;
        HASH_FIND_PTR(ht,&tempL,result);
        if(result != NULL){
            return result->ptr;
        }
        tempL = tempL->next;
    }
    return NULL;
}

要点

  1. 这种查找链表中元素的题都可以想想哈希表,先把A链表存进哈希表中,再用B链表去查找哈希表。

  1. 哈希表使用规则:

①引入哈希表头文件:

#include <uthash.h>

②创建哈希表的结构:

typedef struct HashNode{
    //里面的东西都是可以自己设置的,这里随便设置一个int类型的abc。
    int abc;
    //哈希表句柄,不可少
    UT_hash_handle hh;
}HashNode,*HashTable;

③初始化哈希表,后续添加节点都是添加到这里面。

HashTable ht = NULL;

④添加元素,每次都是要新建一个哈希结点然后填充各种属性,这样整个结构就形成了一个“值”,然后从这个结构中选择一个属性当做“键”。

HashNode * hd = (HashNode*)malloc(sizeof(HashNode));
//填充各种属性
hd->abd = 123;
//插入到哈希表中
HASH_ADD_INT(ht,abc,hd);

这里说明一下HASH_ADD_INT的使用说明,第一个参数是要插入的哈希表(指针形式);第三个参数是哈希结点(指针形式);第二个参数是这个结点中的要拿出来作为键的属性名。

⑤查找元素

HashNode* result;
HASH_FIND_INT(ht,&tempL,result);

这里说明一下HASH_FIND_INT的使用说明,第一个参数是要查找的哈希表(指针形式);第二个参数是键的地址,反正就是之前添加时的键名加个&;第三个参数是通过键名查找到的哈希结点,也就是值,要先申请一个空间接收。

217.存在重复元素

题目

题解

int cmp (const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}

bool containsDuplicate(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(nums[0]),cmp);
    for( int i = 0; i < numsSize-1; i++) {
        if( nums[i] == nums[i+1] ){
            return true;
        }
    }
    return false;
}

要点

  1. c语言有自带快排函数。但是需要自己设置一个比较函数。

  1. 比较函数的形参可以是任意的结构,如果是结构那么函数内比较时比较的是这两个结构中的某一属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东东咚咚东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值