相交链表-基于Go

  • 一般思路
    • 先遍历A链表,记录所有点
  • 再遍历B链表,若已经在记录中存在则返回该节点.
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
type void struct{}

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    if headA==nil||headB==nil{
        return nil
    }

    var nodes = make(map[*ListNode]void)
    for headA!=nil{
        _, ok := nodes[headA]
        // 说明node不经存在
        if !ok{
            nodes[headA] = void{}
        }
        headA = headA.Next
    }
    for headB!=nil{
        _, ok := nodes[headB]
        // 说明node已经存在
        if ok{
            return headB
        }
        headB = headB.Next
    }
    return nil
}
  • 分别计算链长度,链表头移动到同一起点,同时遍历,相同则相交
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    if headA==nil||headB==nil{
        return nil
    }

    var lenA = 0
    var lenB = 0
    // 分别计算链表长度 
    for p := headA; p!=nil; p=p.Next{
        lenA++
    }
    for p := headB; p!=nil; p=p.Next{
        lenB++
    }

    // 将链表头移动到同一起点
    if lenA>=lenB{
        for i:=0;i<lenA-lenB;i++{
            headA = headA.Next
        }
    }else{
        for i:=0;i<lenB-lenA;i++{
            headB = headB.Next
        }
    }

    // 同时遍历,相等则相交
    for headA!=nil{
        if headA==headB{
            return headA
        }
        headA = headA.Next
        headB = headB.Next
    }
    
    return nil
}
posted @ 2021-04-08 15:12  pangqianjin  阅读(91)  评论(0编辑  收藏  举报