【LeetCode】数据结构题解(7)[相交链表]

所属专栏:玩转数据结构题型
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!

1.题目来源

相交链表

2.题目描述

在这里插入图片描述

3.解题思路

  • 按照题目的要求我们分两步来解题。
  1. 判断是否相交。
  2. 找到相交的节点并返回。
  • 首先第一步还是挺简单的,如果两个链表相交了,所以在相交的那个节点之后的数据肯定是相同的,但是我们不知道这两个链表分别是多长的,所以无法从同时从两个链表的头节点开始遍历。而我们发现如果一一遍历的话都是会遍历到尾节点的,而如果相交的话,它们的尾节点肯定是相同的。所以我们就定义两个变量curA和curB,分别遍历两个链表,最后判断尾节点是否相同,如果相同说明相交,反之不相交。
  • 而我们的第二步的话要返回相交的,而我们又不知道这两个链表的长度是都少,那有没有什么办法可以让他们的链表长度相同呢。所以我们想到了一个办法,就是我们先计算出这两个链表的长度分别是多少,然后计算出他们长度的差值,再让那个比较长的链表先走这个差值的长度,最后更长的那个链表从走到差值的节点开始遍历,而更短的链表从头节点看是遍历,这样长度就相同了。

4.代码展示

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 
    {
        if(headA==NULL || headB==NULL)
            return NULL;
        ListNode* curA=headA,*curB=headB;
        //用来计数链表元素的个数
        int countA=0;
        int countB=0;
        //两个链表依次遍历到尾
        while(curA)
        {
            countA++;
            curA=curA->next;
        }
        while(curB)
        {
            countB++;
            curB=curB->next;
        }
        //如果尾相同说明有相交点
        if(curA==curB)
        {
        	//假设headA更长
            ListNode *longList=headA;
            ListNode *shortList=headB;
            //纠正长度
            if(countA<countB)
            {
                longList=headB;
                shortList=headA;
            }
            //计算差值
            int ret=abs(countA-countB);
            //更长的走差值步
            while(ret--)
            {
                longList=longList->next;
            }
            //最后同时遍历,相同则是相交的节点
            while(longList != shortList)
            {
                longList=longList->next;
                shortList=shortList->next;
            }
            return longList;
        }
        else
        {
            return NULL;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_74276498/article/details/130620713