鏈表相交
題目:
給你兩個單鏈表的頭節點 headA 和 headB ,請你找出並返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點,返回 null 。
輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Intersected at '8'
解釋:相交節點的值為 8 (注意,如果兩個鏈表相交則不能為 0)。
從各自的表頭開始算起,鏈表 A 為 [4,1,8,4,5],鏈表 B 為 [5,0,1,8,4,5]。
在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。
思路
listA = [4,1,8,4,5]
listB = [5,0,1,8,4,5]
- 判斷相交點值為8
- 相交點之後值一致,也表明相交點listA,listB後面長度,值一致
- 獲取listA,listB長度
- 長的鏈表先移動到短的鏈表開始位置,目前2個鏈表長度一致
- 遍歷2個鏈表,不相同就向後移動,如果相同,則表明有相交點
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
currA, currB := headA, headB
// 獲取A,B長度
lengthA, lengthB := 0, 0
for currA != nil {
currA = currA.Next
lengthA++
}
for currB != nil {
currB = currB.Next
lengthB++
}
// a,b 長度差距step
var step int
var fast, slow *ListNode
// 長度比較,長的鏈表賦值到fast,短的到slow
if lengthA > lengthB {
step = lengthA - lengthB
fast, slow = headA, headB
} else {
step = lengthB - lengthA
fast, slow = headB, headA
}
// 移動長鏈表,保持2邊長度一致
for i:=0;i<step;i++ {
fast = fast.Next
}
// 遍歷
// 如果不相等,移動一位
for fast != slow {
fast = fast.Next
slow = slow.Next
}
return fast
}