题解 | #两个链表的第一个公共结点#

两个链表的第一个公共结点

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
}

全部评论

相关推荐

神哥了不得:你简历字体有点不太协调呀,下面的字实在太小了呀,而且项目也不太行,建议换几个高质量的项目,面试会多很多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务