力扣 相交連結串列
阿新 • • 發佈:2022-03-08
力扣 相交連結串列
題目連結: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
}