题解 | #两个链表的第一个公共结点#
两个链表的第一个公共结点
https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
func FindFirstCommonNode(pHead1 *ListNode, pHead2 *ListNode) *ListNode {
// write code here
// 遍历第一个链表,全部指向公共节点。
if pHead1 == nil || pHead2 == nil {
return nil
}
if pHead1 == pHead2 {
return pHead1
}
// 记录链表1, 2的长度
r1 := getListLength(pHead1)
r2 := getListLength(pHead2)
diff := 0
// 快慢指针的思想,长的一个先走,遇到相同的就返回
var slow *ListNode
var fast *ListNode
if r1 > r2 {
diff = r1 - r2
fast = pHead1
slow = pHead2
} else {
diff = r2 - r1
fast = pHead2
slow = pHead1
}
for diff > 0 {
fast = fast.Next
diff--
}
for fast != nil {
if fast == slow {
return fast
}
fast = fast.Next
slow = slow.Next
}
return nil
}
func getListLength(list *ListNode) int {
l := 0
tPHead1 := list
for tPHead1 != nil {
l++
tPHead1 = tPHead1.Next
}
return l
}