Golang判断两个链表是否相交的方法详解

 更新时间:2023年03月14日 08:41:30   作者:nil  
这篇文章主要为大家详细介绍了如何通过Golang判断两个链表是否相交,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

算法题:判断2个链表相交

面试中可能会问到的算法题,今天总结一下

方法一:map

步骤:

  • 1.遍历list1,以节点为key放入map中
  • 2.遍历list2,判断每个节点是否在map中,如果在则相交,且顶一个存在的节点是交点
// 定义链表节点
type Node struct {
	val  int
	next *Node
}

// 判断两个链表是否相交
func IsIntersect(list1, list2 *Node) bool {
	if list1 == nil || list2 == nil {
		return false
	}

	m := make(map[*Node]struct{})
	p := list1
	for p != nil {
		m[p] = struct{}{}
		p = p.next
	}

	p = list2
	for p != nil {
		if _, ok := m[p]; ok {
			return true
		}
		p = p.next
	}

	return false
}

// 根据数组生成链表
func New(data []int) *Node {
	nodes := make([]*Node, len(data))
	for i := 0; i < len(data); i++ {
		nodes[i] = &Node{
			val: data[i],
		}
		if i > 0 {
			nodes[i].next = nodes[i-1]
		}
	}

	return nodes[len(data)-1]
}

// 合并两个链表
func Connect(node1, node2 *Node) *Node {
	if node1 == nil {
		return node2
	}

	if node2 == nil {
		return node1
	}

	p := node1
	for p.next != nil {
		p = p.next
	}

	p.next = node2
	return node1
}

测试

func main() {
	data1 := []int{1, 2, 3, 4, 5}
	data2 := []int{6, 7, 8, 9, 10}
	data3 := []int{11, 12, 13, 14, 15}

	node1 := New(data1)
	node2 := New(data2)
	node3 := New(data3)

	node2 = Connect(node2, node1)  // 10,9,8,7,6,5,4,3,2,1
	node3 = Connect(node3, node1)  // 15,14,13,12,11,5,4,3,2,1

	result := data0312.IsIntersect(node2, node3)
	fmt.Println(result) // true
}

方法二:首尾相接法

将链表1的尾指向头,然后遍历链表2,看是否能达到链表1的头,如果能则说明相交

func IsIntersect(list1, list2 *Node) bool {
	if list1 == nil || list2 == nil {
		return false
	}

	// 将链表1的尾指向头
	p := list1
	for p.next != nil {
		p = p.next
	}
	p.next = list1

	// 遍历链表2,如果能到达链表1的头则说明相交
	p = list2
	for p != nil {
		if p == list1 {
			return true
		}

		p = p.next
	}

	return false
}

到此这篇关于Golang判断两个链表是否相交的方法详解的文章就介绍到这了,更多相关Golang判断链表是否相交内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golong字符串拼接性能优化及原理介绍

    Golong字符串拼接性能优化及原理介绍

    最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现,下面这篇文章主要给大家介绍了关于Golang语言如何高效拼接字符串的相关资料,需要的朋友可以参考下
    2023-04-04
  • go语言net包rpc远程调用的使用示例

    go语言net包rpc远程调用的使用示例

    本篇文章主要介绍了go语言net包rpc远程调用的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Go设计模式之策略模式讲解和代码示例

    Go设计模式之策略模式讲解和代码示例

    策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换,本文就将通过代码示例给大家详细的介绍一下Go的策略模式,需要的朋友可以参考下
    2023-08-08
  • golang run时报undefined错误的解决

    golang run时报undefined错误的解决

    这篇文章主要介绍了golang run时报undefined错误的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Go map底层实现与扩容规则和特性分类详细讲解

    Go map底层实现与扩容规则和特性分类详细讲解

    这篇文章主要介绍了Go map底层实现与扩容规则和特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 一文带你了解Go语言中的函数

    一文带你了解Go语言中的函数

    函数是编程中不可或缺的组成部分,在本文中,我们将详细介绍Go语言中函数的概念和使用方法,包括函数的定义、参数和返回值等,需要的可以参考一下
    2023-06-06
  • 深入了解Go语言中sync.Pool的使用

    深入了解Go语言中sync.Pool的使用

    本文将介绍 Go 语言中的 sync.Pool并发原语,包括sync.Pool的基本使用方法、使用注意事项等的内容,对我们了解Go语言有一定的帮助,需要的可以参考一下
    2023-04-04
  • 使用Go语言实现找出两个大文件中相同的记录

    使用Go语言实现找出两个大文件中相同的记录

    这篇文章主要为大家详细介绍了使用Go语言实现找出两个大文件中相同的记录的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • Golang基础教程之字符串string实例详解

    Golang基础教程之字符串string实例详解

    这篇文章主要给大家介绍了关于Golang基础教程之字符串string的相关资料,需要的朋友可以参考下
    2022-07-07
  • 使用Go语言自制简单易用的Web框架

    使用Go语言自制简单易用的Web框架

    这篇文章主要为大家详细介绍了如何使用Go语言实现自制简单易用的Web框架,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论