Leetcode 160. Intersection of Two Linked Lists

本文介绍了一种在两个单链表中寻找它们开始相交节点的方法。通过将其中一个链表首尾相连形成环状结构,利用快慢指针技巧检测并定位交点,最后还原链表结构。该算法力求实现O(n)的时间复杂度与O(1)的空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

begin to intersect at node c1.

Notes:

If the two linked lists have no intersection at all, return null.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.

s思路:
1. 这道题确实做过,印象深刻。通过做辅助线,把问题转换成熟悉的问题,再用熟悉的配方来解决。假设有两条链表A,B,我们先遍历A到A的结尾然后把A的尾巴指向A的头部,这样一来,就有一个cycle,如果我们再从B开始用快慢指针大法去检测这个cycle,并找到cycle所在的地方,就是两条链表的intersection 开始的地方。如果AB没有intersection,那么我们遍历B就不会遇到cycle。
这里写图片描述

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {

        if(!headA||!headB) return NULL;
        ListNode* pa=headA,*pb=headB;
        //step 1:A首尾相连成闭环
        while(pa&&pa->next){
            pa=pa->next;    
        }
        pa->next=headA;
        //step 2:快慢指针检测是否cycle
        ListNode* fast=headB->next,*slow=headB;
        while(fast&&fast!=slow){
            fast=fast->next?fast->next->next:NULL;
            slow=slow->next;    
        }

        if(fast)
        {
            fast=headB;
            slow=slow->next;
            //step 3: 定位cycle起始
            while(fast!=slow){
                fast=fast->next;
                slow=slow->next;
            }
        }
        //step4: 断开刚才引入的cycle
        pa->next=NULL;
        return fast;
    }
};
内容概要:文章阐述了构建安全教育体系以应对2025年挑战的目标、原则、内容设计、实施路径、预期成效及保障措施。面对日益复杂的社会安全形势,文章提出通过系统化、科学化、人性化的安全教育体系提升全民安全意识与应急能力。该体系涵盖知识普及、技能实训、文化培育三个模块,采用沉浸式学习工具、模块化训练、跨领域协作演练等方式。实施路径分为体系构建(2023-2024年)、试点推广(2024-2025年)、全面覆盖(2025年及以后)三个阶段。预期成效包括提升公众安全素养、降低事故发生率、增强社会韧性。保障措施涉及政策、资源、技术和评估四个方面,确保体系的有效运行。 适合人群:社会各界人士,特别是教育工作者、应急管理从业者、政策制定者以及关注公共安全的个人和组织。 使用场景及目标:①适用于各级学校、企业及社区的安全教育规划与实施;②为政策制定者提供构建安全教育体系的参考框架;③帮助教育工作者设计和优化安全教育课程与活动;④提升公众的安全意识与应急能力,降低安全事故的发生率。 其他说明:本文不仅提供了详细的构建方案,还强调了科学性、系统性、人本性和预见性的核心原则,旨在通过多维度、多层次的安全教育实践,推动安全文化深入人心,为社会的可持续发展奠定坚实基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值