2023-08-05力扣今日五题-好题

链接:

剑指 Offer 52. 两个链表的第一个公共节点

题意:

如题

解:

非常有趣的双指针

2023-08-05力扣今日五题-好题_第1张图片

首先我们不管他们是否有公共段啊,我们要知道一个指针从A出发走到A结尾,从B出发走到B结尾,和从B出发最终到A结尾是一样的距离,那么我们先将最后面的N个排除(N取两个链表最短长度-1)

2023-08-05力扣今日五题-好题_第2张图片

那么当Red指针到RedEnd位置,Blue指针到BlueEnd的时候,两个指针走过的距离是一样的,(也就是接下来两个指针同步指向倒数第K个节点,由于公共段最多包含最后N+1个节点,BlueEnd和RedEnd就是倒数第N+1个节点,在此完成同步)接下来判断两个指针是否指向同一个节点即可

我这边使用变量zt标记两个指针是否移动到了另一个链表,如果都移动到了另一个链表还走到了结尾那就没有公共段

实际代码:

#include
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
    ListNode *A=headA,*B=headB;
    if(headA==nullptr||headB==nullptr) return nullptr;
    int zt=0; 
    while(headA!=headB||zt==0)
    {
        headA=headA->next;
        headB=headB->next;
        if(headA==headB&&zt!=0) break;
        if(headA==nullptr)
        {
            headA=B;zt++;
        }
        if(headB==nullptr)
        {
            headB=A;zt++;
        }
    }
    return headA;
}
int main()
{
    
}

限制:

  • 如果两个链表没有交点,返回 null.
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

你可能感兴趣的:(力扣每日一题,leetcode,链表)