找链表的交点

题目首先规定了两链表不为空,所以写代码的时候就不需要考虑链表为空的情况
找链表的交点_第1张图片

找链表的交点_第2张图片

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的长度的,所以计算机是知道那个长的,所以我们只要假设一下
找链表的交点_第3张图片

你可能感兴趣的:(链表,数据结构)