动态

详情 返回 返回

鏈表相交 golang 題解 - 动态 详情

鏈表相交

題目

給你兩個單鏈表的頭節點 headA 和 headB ,請你找出並返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點,返回 null 。

image.png

輸入: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
}
user avatar moax 头像 shoushoudeniupai 头像 lindsay_bubble 头像 dl1024 头像
点赞 4 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.