【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
}
posted @   西*风  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2018-03-08 ZCMU 1019: 分金币
点击右上角即可分享
微信分享提示