1. 程式人生 > 其它 >力扣 相交連結串列

力扣 相交連結串列

力扣 相交連結串列

題目連結: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
}