package main
import (
//"encoding/json"
"fmt"
)
//剑指 Offer 52. 两个链表的第一个公共节点
//如何创建链表:https://www.jianshu.com/p/7ada92d5eeac
//定义单链表结构体
type Node struct {
data interface{} //数据域
next *Node //指针域
}
type List struct {
length int //储存链表的长度
headNode *Node
}
/*单链表的初始化
1、生成新结点作为头结点,用头指针指向头结点
2、头结点的指针域置空
*/
func InitList() *List {
//即构造一个空的单链表L(包含头指针)
node := new(Node)
L := new(List)
L.headNode = node
return L
}
func getIntersectionNode(headA, headB *Node) *Node {
if headA == nil || headB == nil {
return nil
}
pa, pb := headA, headB
for pa.data != pb.data {
if pa == nil {
pa = headB
} else {
pa = pa.next
}
if pb == nil {
pb = headA
} else {
pb = pb.next
}
}
return pa
}
//头部插入函数
func (list *List) AddElem(v interface{}) {
node := &Node{data: v}
//if list.IsNull() { //处理空表的插入,否则会导致一个空的头结点后移
// list.headNode = node
// list.length++
// return
//}
node.next = list.headNode
list.headNode = node
list.length++
return
}
//尾部插入函数
func (list *List) AppendElem(v interface{}) {
node := &Node{data: v}
//if list.IsNull() {
// list.headNode.next = node
//} else {
cur := list.headNode
for cur.next != nil {
cur = cur.next
}
cur.next = node
//}
list.length++
return
}
/*
节点和链表分别建立函数
建立链表输入都是用数组导入,用for循环前插或者后插组成链表
再调一个函数进行获取结果
*/
func main() {
La := InitList()
Lb := InitList()
msga := []int{12, 5, 3, 8, 55, 13}
msgb := []int{1, 2, 3, 83, 553, 132}
for i := range msga {
La.AddElem(msga[i])
Lb.AddElem(msgb[i])
}
mock := getIntersectionNode(La.headNode,Lb.headNode)
fmt.Printf("hello",mock.data)
}
算法:两个链表的第一个公共节点 go实现
于 2022-07-11 09:11:30 首次发布