链表06中,如何找到两个链表的第一个公共节点?

更新于
2026-07-29 13:17:23
17阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1138个文字,预计阅读时间需要5分钟。

链表06中,如何找到两个链表的第一个公共节点?

链表06--两个链表的第一个公共节点

题目概述:找到两个链表的第一个公共节点。

解析参考答案:为了找到两个链表的第一个公共节点,可以采用以下步骤:

1. 首先遍历第一个链表,将所有节点存储在一个集合中。

2.然后遍历第二个链表,并检查每个节点是否在集合中。

链表06中,如何找到两个链表的第一个公共节点?

3.如果找到节点在集合中,则该节点就是两个链表的第一个公共节点。

注意事项:

- 确保在遍历链表时不会出现空指针异常。- 如果两个链表没有公共节点,返回null。

说明:- 题目要求输出结果,可以直接输出公共节点的值。- 算法说明:使用集合来存储第一个链表的节点,然后遍历第二个链表查找。- 输入:两个链表的头节点。- 输出:第一个公共节点的值(如果没有公共节点,则输出null)。


链表06--两个链表的第一个公共节点-jz36

  • ​​题目概述​​
  • ​​解析&参考答案​​
  • ​​注意事项​​
  • ​​说明​​

题目概述

  • 算法说明
    输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
  • 测试用例
    输入:
    L1: p1(1)->p2(2)->p3(3)->p6(6)-p7(7)
    L2: p4(4)->p5(5)->p6(6)-p7(7)
    输出:
    p6(6)

解析&参考答案

  • 解析
    方法1: 使用栈后进先出的思想,将节点分别放在2个栈,每次弹出一个,栈顶必然相同,当不同的时候其上一次弹出的即为公共节点;
    方法2: 分别计算2个链表长度,假设其差为k,则长链表先遍历k,然后同时遍历并比较节点是否相同,第一个相同的即为公共节点。
  • 参考答案
vim jz36.go
package main

import (
"container/list"
"fmt"
)

type ListNode struct {
Val int
Next *ListNode
}

func GetLenList(head *ListNode) int {
if head == nil {
return 0
}
p := head
lenList := 0
for p != nil {
lenList++
p = p.Next
}
return lenList
}

func FindFirstCommonNode(pHead1 *ListNode, pHead2 *ListNode) *ListNode {
len1 := GetLenList(pHead1)
len2 := GetLenList(pHead2)
lenDiff := len1 - len2
p1 := pHead1
p2 := pHead2
if len1 < len2 {
p1 = pHead2
p2 = pHead1
lenDiff = len2 - len1
}
for i := 0; i < lenDiff; i++ {
p1 = p1.Next
}
var result *ListNode = nil
for p1 != nil {
if p1 == p2 {
result = p1
break
}
p1 = p1.Next
p2 = p2.Next
}
return result
}

func FindFirstCommonNodeV2(pHead1 *ListNode, pHead2 *ListNode) *ListNode {
if pHead1 == nil {
return pHead2
}
if pHead2 == nil {
return pHead1
}
l1 := list.New()
l2 := list.New()
p := pHead1
for p != nil {
l1.PushFront(p)
p = p.Next
}
p = pHead2
for p != nil {
l2.PushFront(p)
p = p.Next
}
var result *ListNode = nil
item1 := l1.Front()
item2 := l2.Front()
for item1 != nil && item2 != nil {
if item1.Value == item2.Value {
result = item1.Value.(*ListNode)
item1 = item1.Next()
item2 = item2.Next()
} else {
break
}
}
return result
}

func main() {
p1 := &ListNode{1, nil}
p2 := &ListNode{2, nil}
p3 := &ListNode{3, nil}
p4 := &ListNode{4, nil}
p5 := &ListNode{5, nil}
p6 := &ListNode{6, nil}
p7 := &ListNode{7, nil}
p1.Next, p2.Next, p3.Next, p4.Next, p5.Next, p6.Next, p7.Next = p2, p3, p6, p5, p6, p7, nil
ret := FindFirstCommonNodeV2(p1, p4)
fmt.Println(ret.Val)
}

注意事项

  • to add
  • 说明

  • 当前使用 go1.15.8
  • 参考​​牛客网--剑指offer​​ 标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
  • 注意!!!

    • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
    • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
    • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解


    本文共计1138个文字,预计阅读时间需要5分钟。

    链表06中,如何找到两个链表的第一个公共节点?

    链表06--两个链表的第一个公共节点

    题目概述:找到两个链表的第一个公共节点。

    解析参考答案:为了找到两个链表的第一个公共节点,可以采用以下步骤:

    1. 首先遍历第一个链表,将所有节点存储在一个集合中。

    2.然后遍历第二个链表,并检查每个节点是否在集合中。

    链表06中,如何找到两个链表的第一个公共节点?

    3.如果找到节点在集合中,则该节点就是两个链表的第一个公共节点。

    注意事项:

    - 确保在遍历链表时不会出现空指针异常。- 如果两个链表没有公共节点,返回null。

    说明:- 题目要求输出结果,可以直接输出公共节点的值。- 算法说明:使用集合来存储第一个链表的节点,然后遍历第二个链表查找。- 输入:两个链表的头节点。- 输出:第一个公共节点的值(如果没有公共节点,则输出null)。


    链表06--两个链表的第一个公共节点-jz36

    • ​​题目概述​​
    • ​​解析&参考答案​​
    • ​​注意事项​​
    • ​​说明​​

    题目概述

    • 算法说明
      输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
    • 测试用例
      输入:
      L1: p1(1)->p2(2)->p3(3)->p6(6)-p7(7)
      L2: p4(4)->p5(5)->p6(6)-p7(7)
      输出:
      p6(6)

    解析&参考答案

    • 解析
      方法1: 使用栈后进先出的思想,将节点分别放在2个栈,每次弹出一个,栈顶必然相同,当不同的时候其上一次弹出的即为公共节点;
      方法2: 分别计算2个链表长度,假设其差为k,则长链表先遍历k,然后同时遍历并比较节点是否相同,第一个相同的即为公共节点。
    • 参考答案
    vim jz36.go
    package main

    import (
    "container/list"
    "fmt"
    )

    type ListNode struct {
    Val int
    Next *ListNode
    }

    func GetLenList(head *ListNode) int {
    if head == nil {
    return 0
    }
    p := head
    lenList := 0
    for p != nil {
    lenList++
    p = p.Next
    }
    return lenList
    }

    func FindFirstCommonNode(pHead1 *ListNode, pHead2 *ListNode) *ListNode {
    len1 := GetLenList(pHead1)
    len2 := GetLenList(pHead2)
    lenDiff := len1 - len2
    p1 := pHead1
    p2 := pHead2
    if len1 < len2 {
    p1 = pHead2
    p2 = pHead1
    lenDiff = len2 - len1
    }
    for i := 0; i < lenDiff; i++ {
    p1 = p1.Next
    }
    var result *ListNode = nil
    for p1 != nil {
    if p1 == p2 {
    result = p1
    break
    }
    p1 = p1.Next
    p2 = p2.Next
    }
    return result
    }

    func FindFirstCommonNodeV2(pHead1 *ListNode, pHead2 *ListNode) *ListNode {
    if pHead1 == nil {
    return pHead2
    }
    if pHead2 == nil {
    return pHead1
    }
    l1 := list.New()
    l2 := list.New()
    p := pHead1
    for p != nil {
    l1.PushFront(p)
    p = p.Next
    }
    p = pHead2
    for p != nil {
    l2.PushFront(p)
    p = p.Next
    }
    var result *ListNode = nil
    item1 := l1.Front()
    item2 := l2.Front()
    for item1 != nil && item2 != nil {
    if item1.Value == item2.Value {
    result = item1.Value.(*ListNode)
    item1 = item1.Next()
    item2 = item2.Next()
    } else {
    break
    }
    }
    return result
    }

    func main() {
    p1 := &ListNode{1, nil}
    p2 := &ListNode{2, nil}
    p3 := &ListNode{3, nil}
    p4 := &ListNode{4, nil}
    p5 := &ListNode{5, nil}
    p6 := &ListNode{6, nil}
    p7 := &ListNode{7, nil}
    p1.Next, p2.Next, p3.Next, p4.Next, p5.Next, p6.Next, p7.Next = p2, p3, p6, p5, p6, p7, nil
    ret := FindFirstCommonNodeV2(p1, p4)
    fmt.Println(ret.Val)
    }

    注意事项

  • to add
  • 说明

  • 当前使用 go1.15.8
  • 参考​​牛客网--剑指offer​​ 标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
  • 注意!!!

    • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
    • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
    • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解