这道题目,虽然实现起来并不困难,但是思路很巧妙。
解这道题 我们需要对 2个 链表把他们 作相交 看看 有没有公共部分,但是 最大的问题是, 只要 我们把 链表长度 对最后一位对齐 把 每一位 比较下 节点地址 一样就返回,
上面一种巧妙地方式 就是 让 a + b = b + a
把 a 循环到 结尾 后 绕到B去
B循环到结尾后 绕到A 去
这样 下一次比较的时候 他们长度就对齐了。
思路很简单 就是2个链表哪个长度长 就把 前面的掐掉 , 但上面那种写法比较巧妙。
下面给出 2个版本的代码:
func getIntersectionNode(headA, headB *ListNode) *ListNode {
//声明 函数指针
var getDeepth func(node *ListNode) int
//计算长度
getDeepth = func(node *ListNode) int{
if node == nil{
return -1
}
return getDeepth(node.Next) + 1
}
lena := getDeepth(headA)
lenb := getDeepth(headB)
for headA != nil || headB != nil{
if lena > lenb{
headA = headA.Next
lena --
}else if lena < lenb{
headB = headB.Next
lenb --
}else{
if headA == headB{
return headA
}
headA = headA.Next
headB = headB.Next
}
}
return nil
}
func getIntersectionNode(headA,headB *ListNode)*ListNode{
nodeA,nodeB:=headA,headB
for nodeA!=nodeB {
if nodeA!=nil{
nodeA=nodeA.Next
}else{
nodeA=headB
}
if nodeB!=nil{
nodeB=nodeB.Next
}else{
nodeB=headA
}
}
return nodeA
}