首页 > 其他分享 >链表相交问题

链表相交问题

时间:2023-12-31 13:44:08浏览次数:41  
标签:问题 head 相交 next 链表 loop2 loop1 null

链表

链表相交问题

思路来源

一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到

笔记内容

  • 问题描述:

    现有两个单向链表,需要判断两个链表是否相交,若相交,返回链表最开始的交点,若不相交,则返回null

  • 算法思路:

    • 首先需要判断两个链表是否是环形链表,并获取环形链表的环开始点

    • 针对两个链表的不同情况进行分析:

      1. 若两个链表都不存在环,那么两个链表要么从头至尾都没有相交节点,要么从相交节点开始到结尾都是共用的;

      2. 若两个链表中存在一个环,那么两个链表不相交;

      3. 若两个链表都存在环,那么需要根据环开始点进行判断。如果是同一个开始点,那么两个链表必相交,相交点可能在该点前,视作第一种情况处理;如果开始点不同,相交点可能在环内或者不相交。

  • 代码实现

    public static ListNode isMeet(ListNode head1,ListNode head2){
            ListNode loop1 = hasCycle(head1);
            ListNode loop2 = hasCycle(head2);
            if(loop2 == null && loop1 == null){ //两个无环
                int p = length(head1,null)-length(head2,null);
    
                loop1 = p > 0 ? head1 : head2 ;
                loop2 = loop1 == head1 ? head2 : head1;
                p = Math.abs(p);
                while (p>0){
                    loop1 = loop1.next;
                    p--;
                }
                while (loop2 != null && loop1 != null){
                    if(loop2 == loop1){
                        return loop1;
                    }
                    loop1 = loop1.next;
                    loop2 = loop2.next;
                }
    
            }else if(loop2 == null || loop1 == null){ //存在一个有环
                return null;
            }else { //两个环
                if(loop2 == loop1){
                    int p = length(head1,loop1)-length(head2,loop2);
                    loop1 = p > 0 ? head1 : head2 ;
                    loop2 = loop1 == head1 ? head2 : head1;
                    p = Math.abs(p);
                    while (p>0){
                        loop1 = loop1.next;
                        p--;
                    }
                    while (loop2 != null && loop1 != null){
                        if(loop2 == loop1){
                            return loop1;
                        }
                        loop1 = loop1.next;
                        loop2 = loop2.next;
                    }
    
                }else {
                    ListNode cur = loop1.next;
                    while (cur != loop1){
                        if(cur == loop2){
                            return loop1;
                        }
                        cur = cur.next;
                    }
                }
    
            }
            return null;
    
        }
    
        public static int length(ListNode head,ListNode end){
            int count = 0;
            if(end == null){
                while (head != null){
                    count++;
                    head = head.next;
                }
            }else {
                while (head != end){
                    count++;
                    head = head.next;
                }
            }
            return count;
        }
    
        //快慢指针
        public static ListNode hasCycle(ListNode head) {
            if(head == null || head.next == null || head.next.next == null){
                return null;
            }
            ListNode slow = head.next;
            ListNode fast = head.next.next;
            while (slow != fast){
                if(fast.next == null || fast.next.next == null){return null;}
                slow = slow.next;
                fast = fast.next.next;
            }
            fast = head;
            while (slow != fast){
                fast = fast.next;
                slow = slow.next;
            }
            return fast;
        }
    

标签:问题,head,相交,next,链表,loop2,loop1,null
From: https://www.cnblogs.com/nouleeee/p/17937456

相关文章

  • 信息论与人工智能的伦理问题: 如何平衡利益与风险
    1.背景介绍信息论与人工智能的伦理问题是近年来随着人工智能技术的快速发展而引起的一个重要话题。随着数据、算法和计算能力的不断发展,人工智能技术已经成为了许多领域的重要驱动力,例如医疗诊断、金融风险管理、自动驾驶等。然而,随着人工智能技术的广泛应用,也引发了一系列伦理问题......
  • SourceTree SSH第一次登录需要交互确认的问题
    问题在SourceTreeSSH配置完ssh之后向上提交代码的时候发现:Theserver'shostkeyisnotcachedintheregistry.Youhavenoguaranteethattheserveristhecomputeryouthinkitis.Theserver'srsa2keyfingerprintis:ssh-rsa2048**:**:**:**:**:**:**:**:**:*......
  • SourceTree SSH第一次登录需要交互确认的问题
    问题在SourceTreeSSH配置完ssh之后向上提交代码的时候发现:Theserver'shostkeyisnotcachedintheregistry.Youhavenoguaranteethattheserveristhecomputeryouthinkitis.Theserver'srsa2keyfingerprintis:ssh-rsa2048**:**:**:**:**:**:**:**:**:......
  • day03 代码随想录算法训练营 203. 移除链表元素
    题目:203.移除链表元素我的感悟:题目里的节点是已经给好的,创建虚拟节点,是为了方便处理头节点。加油,我可以的!!!!!理解难点:节点已经给好的创建虚拟节点代码难点:p是临时变量,类似于foriinrange(10)这里的i,本身是用完就扔的。返回值为什么不能是p.next?因为p是一个指针,......
  • 环形链表问题
    链表环形链表问题思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题来源:基于力扣141题进行拓展问题描述:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存......
  • Android Studio Build窗口出现中文乱码问题
    问题:Androidstudio使用时,报错出现提示乱码问题,无法查看具体报错问题,如图解决方法:可点击studio状态栏的Help—>EditCustomVMOptions,操作如下图在文件后面添加-Dfile.encoding=UTF-8(要注意不能有空格,否则studio可能打不开)添加完成后重启AndroidStudio,就可以看到......
  • 【Redis】一文掌握Redis原理及常见问题
    Redis是基于内存数据库,操作效率高,提供丰富的数据结构(Redis底层对数据结构还做了优化),可用作数据库,缓存,消息中间件等。如今广泛用于互联网大厂,面试必考点之一,本文从数据结构,到集群,到常见问题逐步深入了解Redis,看完再也不怕面试官提问!高性能之道单线程模型基于内存操作epoll多......
  • 【MySQL】一文看懂MySQL所有常见问题
    MySQL作为一款开源关系型数据库,如今绝对是占据关系型数据库的主导地位,不仅是面试中的常客,也是日常工作中最主要接触的数据库。因此,无论是背面试八股,还是工作使用,都是一定要深度掌握的一个知识点。今天就用一篇文章讲清楚MySQL的所有问题着急的小伙伴可直接跳到最后MySQL常见面试......
  • 解决 typescript node tsx 的兼容问题
    问题在项目中使用typescript+tsx+node存在各种兼容问题,包括:[esbuildError]:Top-levelawaitiscurrentlynotsupportedwiththe"cjs"outputformatCannotfindmodule'X'.Didyoumeantosetthe'moduleResolution'optionto'......
  • 【数据结构】链式家族的成员——循环链表与静态链表
    循环链表与静态链表导言大家好!很高兴又和大家见面啦!!!经过前面的介绍,相信大家对链式家族的成员——单链表与双链表的相关内容都已经熟练掌握了。前面我们重点介绍了通过C语言来实现单链表与双链表的一些基本操作,希望大家私下能够多多练习一下,帮助自己去吸收消化这些内容。在今天的篇......