160链表相交

哈希肯定是能解的,就想着有没有其他方法。最开始的思路是翻转链表,然后再来找相交结点,但是题目要求不能改链表结构。
官方题解的第二种方法确实巧妙,如果有相交结点的话最多通过两次遍历就一定能找到。在分析中,其实我们也可以把两个不相交的链表看做相交,但是相交结点为nullptr
代码随想录上将两个链表尾部对齐,然后从短链表的位置开始,两个指针后移。这里由于是一旦出现相交则后续的结点都相同,因此这种方法是正确的。

//官方题解方法
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA == nullptr || headB == nullptr)
        {
            return nullptr;
        }
        ListNode* curA = headA;
        ListNode* curB = headB;
       //实质是while( curA != curB && !(curA==nullptr&&curB==nullptr) ),但后面那个其实就是curA==curB
	   while(curA != curB)
        {
            if(curA == nullptr) 
                curA = headB;
            else
                curA = curA->next;
                
            if(curB == nullptr)
                curB = headA;
            else
                curB = curB->next;           
        }
        return curA;
    }
};
//代码随想录的解法
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
       int lA=0, lB=0;
        ListNode* curA = headA;
        ListNode* curB = headB;
       while( curA != nullptr)
       {
        lA++;
        curA = curA->next;
       }
       while( curB != nullptr)
       {
        lB++;
        curB = curB->next;
       }

        curA = headA;
        curB = headB;
        // 确定让curA为最长链表的头,lA为其长度
        if (lB > lA) {
            swap (lA, lB);
            swap (curA, curB);
        }
        int gap = lA - lB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != nullptr) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return nullptr; 
    }
};
posted @ 2025-01-04 22:15  名字好难想zzz  阅读(11)  评论(0)    收藏  举报