您的位置:首页 > 游戏 > 游戏 > 百度网盘官网_免费企业网站源码大全_seo搜索优化网站推广排名_关键帧

百度网盘官网_免费企业网站源码大全_seo搜索优化网站推广排名_关键帧

2025/1/1 13:56:23 来源:https://blog.csdn.net/ajsjnnn/article/details/144790627  浏览:    关键词:百度网盘官网_免费企业网站源码大全_seo搜索优化网站推广排名_关键帧
百度网盘官网_免费企业网站源码大全_seo搜索优化网站推广排名_关键帧

题目来源

160. 相交链表 - 力扣(LeetCode)


题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

​编辑

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。


题目限制

使用最优解做完此题

要求时间复杂度O(n+m)

空间复杂度O(1)


思路分析

这道题要找两个无环单链表的相交起始节点。常规暴力法是对链表A每个节点,遍历链表B看是否有相同节点,时间复杂度为\(O(mn)\)(\(m\)、\(n\)分别为两链表长度),效率低。高效思路是利用双指针,让两指针分别从两链表头出发,当一个指针到达链表尾时,重新指向另一链表头继续走,这样两指针走过相同总路程,若相交,会在相交起始节点相遇,若不相交,最终都会走到null,时间复杂度\(O(m + n)\),通过此方法可高效解决该问题 。


具体代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if(!headA||!headB)return nullptr;ListNode* a=headA;ListNode* b=headB;//如果没有香蕉的  到最后两个人都走到同一个地址但是 是空指针nullptr //判断条件写a=b时结束  返回香蕉的值  或者返回空while(a!=b){a=a?a->next:headB;b=b?b->next:headA;}return a;}
};

这段 C++ 代码定义了 Solution 类中的 getIntersectionNode 函数,用于找出两个单链表 headA 和 headB 的相交节点。首先检查 headA 和 headB 是否为空,若有一个为空则直接返回 nullptr,因为空链表不存在相交节点。接着,定义两个指针 a 和 b 分别指向 headA 和 headB。通过一个 while 循环,只要 a 和 b 不相等就持续循环。在每次循环中,a 指针移动到下一个节点,如果 a 已经到达链表末尾(即 a 为 nullptr),则将 a 重新指向 headB;同理,b 指针移动到下一个节点,若 b 到达链表末尾则重新指向 headA。这样做的目的是让两个指针走过相同的距离,从而找到相交节点。当 a 和 b 相等时,循环结束,此时 a (或 b)即为相交节点,返回 a。若两个链表不相交,最后 a 和 b 都会指向 nullptr 并结束循环,同样返回 a(即 nullptr) 。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com