leetcode 刷题笔记—160.相交链表-双指针、哈希表

86 阅读2分钟

题目通道

leetcode.cn/problems/in…

解题方法

1.双指针

由于给出的两个链表长度并不相同,而理解题意,相交元素后所有的元素相同,个数也相同,所以我们首先要做的是建立两个指针,并调整两个指针的位置,消除两个链表的高度差,方法如下:

1.创建指针pA指向headA,创建指针pB指向headB,依次向后遍历两个链表

2.如果 pA 到了末尾,则 pA = headB 继续遍历

3.如果 pB 到了末尾,则 pB = headA 继续遍历

4.经过条件为pA!=pB的循环,循环结束时,如果两链表存在相交,则pA和pB将会指向同一位置,此时直接返回该位置的地址即为所求

image.png

image.png

image.png

图片来自:leetcode.cn/problems/in…

C语言的代码实现如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    //判断所给链表是否存在空链表
    if(headA==NULL||headB==NULL)
    {
        return NULL;
    }
    else
    {
        struct ListNode* pa=headA;
        struct ListNode* pb=headB;
        while(pa!=pb)
        {
            //此语句在本质上是一个判断和赋值语句结合的语句,先进行判断,将结果重新赋值pa
            pa=(pa==NULL?headB:pa->next);
            pb=(pb==NULL?headA:pb->next);
        }
        return pa;
    }
}

2.哈希表

判断两个链表是否相交可以使用哈希表的方式实现,具体思想是:

1.先将headA链表中的值存储到哈希表中

2.再依次判断headB的每个结点元素在哈希表中是否存在,若存在,则第一个找到的元素即为两链表的相 交元素,将其返回,若没找到则说明两链表不存在相交

C语言实现代码如下:

 //定义哈希结构体
struct hash_table
{
    struct ListNode* key;
    UT_hash_handle hh;
};

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    //创建哈希表
    struct hash_table* hash=NULL;
    //创建链表的操作指针
    struct ListNode* temp=headA;
    //将headA中所有结点的数据录入哈希表中
    while(temp!=NULL)
    {
        //创建哈希结构体返回指针
        struct hash_table* tmp;
        //调用函数库对哈希表进行查找操作
        //函数规定,若找到关键值,tmp则返回查找结果,否则返回NULL
        HASH_FIND(hh,hash,&temp,sizeof(struct hash_table*),tmp);
        if(tmp==NULL)//说明哈希表中不存在该元素,则将该元素存入哈希表
        {
            tmp=malloc(sizeof(struct hash_table));
            tmp->key=temp;
            //将元素添加至哈希表中
            HASH_ADD(hh,hash,key,sizeof(struct hash_table*),tmp);
        }
        //指针后移
        temp=temp->next;
    }
    //指针指向headB
    temp=headB;
    while(temp!=NULL)
    {
        struct hash_table* tmp;
        HASH_FIND(hh,hash,&temp,sizeof(struct hash_table*),tmp);
        if(tmp!=NULL)
        {
            return temp;
        }
        temp=temp->next;
    }
    return NULL;
}

注:此段代码运用了uthash.h库