题目
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
图示两个链表在节点 c1
开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
思路
这道题有很多种解法,第一种解法就是遍历这俩链表,依次比较。例如:我遍历A链表,每遍历A中的一个元素,我就拿这个元素和B链表比对,遍历B链表,看该元素地址是否在B中存在。值得注意的是,我们这里遍历,判断俩链表是否相交,不是根据链表的值,而是根据链表中元素的地址。例如下图
由图可知,如果我们用链表的元素比对,当cur走到链表A的2那里,让cur对B遍历对比,两个都是2,你能说他们相交嘛?肯定不能了,因此这里的链表比对,比对的是地址,而不是值。
第二种解法:我们仔细观察图片,发现A链表比B长,我们假设A比B长K,我们先让A链表先走K步,再让A,B同时走,每同时走一步都需要判断他们当前存放的下一个地址是否相同,若是,就停下。
代码如下:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//分别求出这俩的长度
int longa=0;
int longb=0;
struct ListNode *cura=headA;
struct ListNode *curb=headB;
while(cura->next)
{
cura=cura->next;
longa++;
}
while(curb->next)
{
curb=headB->next;
longb++;
}
int k=abs(longa-longb);
//cura = headA;
//curb = headB;
if(longa>longb)
{
while(k--)
{
cura=cura->next;
}
}
else
{
while(k--)
{
curb=curb->next;
}
}
while(cura!=curb)
{
cura=cura->next;
curb=curb->next;
}
return cura;
}
可是这题当你在力扣上提交时,你会发现过不了,它提示你超出时间限制
这.......有点意思.....我们再次仔细阅读代码,你就会发现
代码:
由此,我们再次写出正确的代码。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//分别求出这俩的长度
int longa=0;
int longb=0;
struct ListNode *cura=headA;
struct ListNode *curb=headB;
while(cura->next)
{
cura=cura->next;
longa++;
}
while(curb->next)
{
curb=curb->next;
longb++;
}
int k=abs(longa-longb);
cura = headA;
curb = headB;
if(longa>longb)
{
while(k--)
{
cura=cura->next;
}
}
else
{
while(k--)
{
curb=curb->next;
}
}
while(cura!=curb)
{
cura=cura->next;
curb=curb->next;
}
return cura;
}