【LeetCode】相交链表(快慢指针)
力扣 相交链表
题目链接: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
}
心之所向,素履以往
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2018-03-08 ZCMU 1019: 分金币