力扣 相交链表
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
题目大致意思就是判断两个链表有没有交点,有的话给出交点,没有的话返回null
要求是不能修改链表,并且时间复杂度为O(N+M),空间复杂度为O(1)
假设,有两个链表A和B,长度为N和M,p和q分别指向A和B链表的头节点
方法1:
- 长链表上的指针先走|N-M|步,然后两个链表上的指针一起走,如果有交点,某个时刻,两个指针指向的节点必会是同一个节点
方法2:
-
两个指针分别向后走,p走到nil则p指向B头结点然后继续走,q走到nil则q指向A的头结点然后继续走
-
当A和B链表没有交点时,p和q走完N+M步后,必定p和q都指向nil
-
当A和B链表存在交点时,某一时刻p和q必定指向同一个节点,该节点就是相交节点
代码如下:
方案1:
func getIntersectionNode(headA, headB *ListNode) *ListNode {
m,n:=0,0
p,q:=headA,headB
for p!=nil{
m++
p=p.Next
}
for q!=nil{
n++
q=q.Next
}
p,q=headA,headB
if m<n{
step:=n-m
for step>0{
q=q.Next
step--
}
}else {
step:=m-n
for step>0{
p=p.Next
step--
}
}
for p!=nil&&q!=nil{
if p.Val==q.Val&&p==q{
return p
}
p=p.Next
q=q.Next
}
return nil
}
方案2:
func getIntersectionNode(headA, headB *ListNode) *ListNode {
p,q:=headA,headB
if p==nil||q==nil{
return nil
}
for p!=q{
if p==nil{
p=headB
}else {
p=p.Next
}
if q==nil{
q=headA
}else {
q=q.Next
}
}
return p
}