- 一般思路
- 再遍历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
}