相交链表(数据结构初阶题)

题目

给你两个单链表的头节点 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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dongliner~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值