Leecode 160-相交链表

该篇博客探讨了一个算法问题,即如何在O(n)的时间复杂度和O(1)的空间复杂度下找到两个单链表的交点。通过迭代两个链表,当它们的节点相遇时找到交点。如果不存在交点,则返回null。官方提供的解决方案是通过同时遍历两个链表直到它们相遇,简化了原链表结构的维护,提高了效率。
摘要由CSDN通过智能技术生成

题目描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

在这里插入图片描述
在这里插入图片描述
提示:

listA 中节点数目为 m
listB 中节点数目为 n
0 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n

如果 listA 和 listB 没有交点
intersectVal 为 0
如果 listA 和 listB 有交点,
intersectVal == listA[skipA + 1] == listB[skipB + 1]

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *A,*B,*p;

    //保证原链表结构不变
    A=headA;

    while(A!=NULL)
    {
        B=headB;
        while(B!=NULL)  //遍历链表B查看是否有交点
        {
            if(A==B)        //找到交点
            {
                p=A;    //结构体指针指向此相交结点
                return p;   //返回相交结点的地址
            }
            B=B->next;
        }
        A=A->next;
    }
    return NULL;    //执行到此处,说明没有相交结点,返回NULL,
}

进阶:
你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?

官方题解
在这里插入图片描述
在这里插入图片描述
官方给出的代码

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if (headA == NULL || headB == NULL) {
        return NULL;
    }
    struct ListNode *pA = headA, *pB = headB;
    while (pA != pB) {
        pA = pA == NULL ? headB : pA->next;
        pB = pB == NULL ? headA : pB->next;
    }
    return pA;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值