链表算法题目--链表相交

本文探讨了链表相交的几种情况,包括无环链表的相交判断,有环链表的相交判断,以及如何确定链表的环入口。通过快慢指针法和长度差计算等方法解决链表相交问题,并提供了完整的方法调用思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考《程序员代码面试指南》。

链表相交问题

判断两个单链表是否相交:
链表可能是有环也可能是无环的。

  1. 对于每一个链表,判断链表是否有环,如果有环,返回第一个进环节点。
  2. 两个无环链表是否相交。
  3. 两个有环链表是否相交。
  4. 一个有环一个无环一定不相交。

判断链表是否有环

方法1:创建HashSet存储已遍历过的节点,每遍历到一个新节点,就与HashSet中的节点比较。

方法2:快慢指针法
定义两个指针slow,fast,slow每次走1步,fast每次走两步,如果链表有环,两个指针最终一定能碰上。如果fast指针指向了null,链表无环。

如何判断有环节点的入口?
在两个指针相遇时,将fast指针移动到链表头部,slow指针不动,两个指针同时每次只移动一步,再次相遇的点是入环口。

	public static Node getLoopNode(Node head) {
   
   
		if (head == null || head.next == null || head.next.next == null) {
   
   
			return null;
		}
		Node n1 = head.next; //slow
		Node n2 = head.next.next; //fast
		while (n1 != n2) {
   
   
			if (n2.next == null || n2.next.next == null) {
   
   
				return null;
			}
			n2 = n2.next.next;
			n1 = n1.next;
		}
		//找入口
		n2 = head; 
		while (n1 != n2) {
   
   
			n1 = n1.next;
			n2 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值