【每日算法】【160. 相交链表】

在这里插入图片描述

☀️博客主页:CSDN博客主页
本文由 我是小狼君 原创,首发于 CSDN
学习专栏推荐:面试汇总
❗️游戏框架专栏推荐:游戏实用框架专栏
⛅️点赞 收藏 ⭐留言 ,如有错误请指正
未来很长,值得我们全力奔赴更美好的生活✨


Unity 小科普

老规矩,先介绍一下Unity的科普小知识:​​​​​​

  • Unity 是行业领先的实时3D开发平台。
  • 包括游戏开发,电影,AR/VR,虚拟现实在内的所有创作者,可以将梦想照进现实。
  • Unity提供了一套完整完善的软件解决方案,可用于创作,运营和模拟任何2D和3D的内容,进本全平台支持。

题目

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

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

【每日算法】【160. 相交链表】_第1张图片

链接

简单-160. 相交链表

示例 1:

【每日算法】【160. 相交链表】_第2张图片

示例 2:

【每日算法】【160. 相交链表】_第3张图片

方法一(平民解法)

暴力破解方法

代码

 private static ListNode HandleData(ListNode headA, ListNode headB)
 {
     ListNode tempA = headA;
     ListNode returnNode = null;
     while (tempA != null)
     {
         ListNode tempB = headB;
         while (tempB != null)
         {
             if (tempA == tempB)
             {
                 returnNode = tempA;
                 break;
             }
             tempB = tempB.next;
         }
         if (returnNode != null)
         {
             break;
         }
         tempA = tempA.next;
     }
     return returnNode;
 }

分析

时间复杂度:O(n2)
空间复杂度:O(1)

方法二(大神解法)

文艺版解释

走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。

人话版解释

若相交,链表A: a+c, 链表B : b+c. a+c+b+c = b+c+a+c 。则会在公共处c起点相遇。若不相交,a +b = b+a 。因此相遇处是NULL

无脑版解释

pA走过的路径为A链+B链
pB走过的路径为B链+A链
pA和pB走过的长度都相同,都是A链和B链的长度之和,相当于将两条链从尾端对齐,如果相交,则会提前在相交点相遇,如果没有相交点,则会在最后相遇。

pA:1->2->3->4->5->6->null->9->5->6->null
pB:9->5->6->null->1->2->3->4->5->6->null

代码

private static ListNode HandleData(ListNode headA, ListNode headB)
   {
       if (headA == null || headB == null)
       {
           return null;
       }
       ListNode pA = headA;
       ListNode pB = headB;

       while (pA != pB)
       {
           pA = pA == null ? headB : pA.next;
           pB = pB == null ? headA : pB.next;
       }
       return pA;
   }

分析

时间复杂度:O(n)
空间复杂度:O(1)

链接

我的LeetCode
算法题GitCode

你可能感兴趣的:(数据结构与算法,链表,算法,数据结构,c#)