【剑指Offer学习】【题55:链表中环的入口结点】

题目:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路:
思路1:创建一个链表用于按扫描的顺序保存节点,直到下一个节点在list中已经存在,那就说明该节点就是入口节点
思路2:规律求解
创建两个指针p1、p2,其中p1的步长为1,p2的步长为2。让两个指针从头结点开始往后走,如果有环的话,两个指针一定会相遇。
在这里插入图片描述
程序:

程序1import java.util.ArrayList;

class ListNode{
	int val;
	ListNode next;
	ListNode(int val) {
		this.val = val;
	}
}
public class subject55 {
	public static ListNode EntryNodeOfLoop(ListNode pHead) {
		if(pHead == null || pHead.next == null) {
			return null;
		}
		ArrayList<ListNode> list = new ArrayList<ListNode>();
		list.add(pHead);
		ListNode nextpHead = pHead.next;
		while(! list.contains(nextpHead)) {
			list.add(nextpHead);
			nextpHead = nextpHead.next;
		}
		return nextpHead;
	}
}

程序2class ListNode{
	int val;
	ListNode next;
	ListNode(int val) {
		this.val = val;
	}
}
public class subject55 {
	public static ListNode EntryNodeOfLoop(ListNode pHead) {
		if(pHead == null || pHead.next == null) {
			return null;
		}
		ListNode node1 = pHead.next;
		ListNode node2 = pHead.next.next;
		//寻找相遇的结点
		while(node1 != node2) {
			node1 = node1.next;
			node2 = node2.next.next;
		}
		//步长都为 1,找到相遇的结点
		//这个结点就是入口
		ListNode firstNode = pHead;
		while(firstNode != node1) {
			firstNode = firstNode.next;
			node1 = node1.next;
		}
		return firstNode;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值