题目通道
解题方法
1.双指针
由于给出的两个链表长度并不相同,而理解题意,相交元素后所有的元素相同,个数也相同,所以我们首先要做的是建立两个指针,并调整两个指针的位置,消除两个链表的高度差,方法如下:
1.创建指针pA指向headA,创建指针pB指向headB,依次向后遍历两个链表
2.如果 pA 到了末尾,则 pA = headB 继续遍历
3.如果 pB 到了末尾,则 pB = headA 继续遍历
4.经过条件为pA!=pB的循环,循环结束时,如果两链表存在相交,则pA和pB将会指向同一位置,此时直接返回该位置的地址即为所求
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库