哈希肯定是能解的,就想着有没有其他方法。最开始的思路是翻转链表,然后再来找相交结点,但是题目要求不能改链表结构。
官方题解的第二种方法确实巧妙,如果有相交结点的话最多通过两次遍历就一定能找到,因此。在分析中,其实我们也可以把两个不相交的链表看做相交,但是相交结点为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;
}
};
标签:ListNode,nullptr,相交,链表,curB,headB,curA,160
From: https://www.cnblogs.com/gqzz/p/18652574