【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 @ 2022-03-08 16:44  西*风  阅读(113)  评论(0)    收藏  举报