Loading

链表相交

面试题 02.07. 链表相交

同:160.链表相交

力扣题目链接(opens new window)

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

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

img

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

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

示例 1:

img

示例 2:

img

示例 3:

imgimg

#思路

简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

面试题02.07.链表相交_1

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

面试题02.07.链表相交_2

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

否则循环退出返回空指针。

package main

func getIntersectionNode(headA, headB *ListNode) *ListNode {
   curA:=headA
   curB:=headB
   lenA:=0
   lenB:=0
   tmp1:=0
   for curA!=nil{
      curA=curA.Next
      lenA++
   }
   for curB!=nil{
      curB=curB.Next
      lenB++
   }
   curA=headA
   curB=headB
   if lenB>lenA{
      tmp1=lenA
      lenA=lenB
      lenB=tmp1
      curB=headA
      curA=headB
   }
   gap:=lenA-lenB
   for ;gap>0;gap--{
      curA=curA.Next
   }
   for curA!=nil{
      if curA==curB{
         return curA
      }
      curA=curA.Next
      curB=curB.Next
   }
   return nil

}

双指针法

我们总是可以把它想像成运动问题,如果我想知道C点(注意AC与BC不一定一样长),而只有两个人,怎么跑才能让他们相遇在C点呢?总不能说一个先跑到C等另一个吧,那还求个锤子?你都知道C了。

因为C点是一个未知点,我们用从速度来着手。(快慢指针也是这样)

如果同速度,那路程相同就可以了,所以第一个人跑AD然后再从B开始跑BC,第二个人跑BD然后跑AC。因为总的路程一样,所以。
A D + B C = B D + A C AD + BC = BD + AC
AD+BC=BD+AC

那这时相等就肯定是C点。

package main

func getIntersectionNode(headA, headB *ListNode) *ListNode {
   curA:=headA
   curB:=headB
   lenA:=0
   lenB:=0
   tmp1:=0
   for curA!=nil{
      curA=curA.Next
      lenA++
   }
   for curB!=nil{
      curB=curB.Next
      lenB++
   }
   curA=headA
   curB=headB
   if lenB>lenA{
      tmp1=lenA
      lenA=lenB
      lenB=tmp1
      curB=headA
      curA=headB
   }
   gap:=lenA-lenB
   for ;gap>0;gap--{
      curA=curA.Next
   }
   for curA!=nil{
      if curA==curB{
         return curA
      }
      curA=curA.Next
      curB=curB.Next
   }
   return nil

}
posted @ 2022-09-05 20:55  suehoo  阅读(95)  评论(0)    收藏  举报