找链表的交点

题目首先规定了两链表不为空,所以写代码的时候就不需要考虑链表为空的情况
在这里插入图片描述

在这里插入图片描述

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
   
    struct ListNode *cur1=headA;
    struct ListNode *cur2=headB;
    int long1=1;
    int long2=1;
    //找到两链表的尾节点,并算数各自的长度
    while(cur1->next)
    {
        cur1=cur1->next;
        long1++;
    }
     while(cur2->next)
    {
        cur2=cur2->next;
        long2++;
    }
    //如果尾节点不相等,就不会相交
    if(cur1!=cur2)
    {
        return NULL;
    }
    //abs函数求出绝对值(两节点的长度差)
    int k=abs(long1-long2);
//假设法找到巧妙运用到长节点
   struct ListNode *longList=headA;
   struct ListNode *shortList=headB;
   if(long1<long2)
   {
         longList=headB;
         shortList=headA;
   }
   //长的先走k步
   while(k--)
   {
       longList=longList->next;
   }
   //一起走
   while(longList!=shortList)
   {
       longList=longList->next;
       shortList=shortList->next;
   }
   //返回交点longList或shortList
   return longList;

}

值得注意的是这里用到了求两整形绝对值的函数asb

还有在判断那个链表长的时候并没有直接明确的去找,因为计算机是已经知道long1和long2的长度的,所以计算机是知道那个长的,所以我们只要假设一下
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值