初级算法:回文链表

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路一:利用哈希表的不重复性(低效率)

	public boolean hasCycle(ListNode head) {
		HashSet hashSet = new HashSet<>();
		while (head != null) {
			boolean ans = hashSet.add(head);
			if (ans == false)
				return true;
			head = head.next;
		}
		

思路二:

一个环形链表:{A,B,C,A,B,C,……} 其上存在两个指针,A指针移动速度是B指针的两倍。 A,B同时从节点1出发,所经过的节点如下: 快指针A:A->C->B->A 慢指针B:A->B->C->A
A、B指针在节点A第一次相遇,循环次数为3,而环的程度正好也为3。那这个是不是巧合呢? 首先我们要理解的是循环的次数代表的是什么。

  1. 每次循环,对于B这个慢指针来说,意味着走了一个单位长度。
  2. 而对于A来说,走了两个单位长度。
  3. 那么二者第一次相遇必然是在A走了2圈,B走了1圈的时候。
  4. 假如A的速度是B的3倍,那么二者第一次相遇是在A走了3圈,B走了1圈的时候。
  5. 同理A是B的5倍速度,相遇时A走了5圈,B走了1圈 … n. A的速度是B的n倍,相遇时A走了n圈,B走了1圈 从上面的观察我们可以发现,无论A的速度是B的几倍,两者第一次相遇必然是在B走了1圈时。
    因为B的速度代表的是链表基本的长度单位,即从一个节点移动到下一个节点的距离。 同时在链表中,每个节点与节点之间这个距离是不变的。
    当循环结束时,B走了1圈,正好是环的长度。而B每次移动一个单位距离,因此环的长度等于循环次数。

原文链接:https://blog.youkuaiyun.com/qq_34364995/article/details/80518191

代码如下

	public boolean hasCycle(ListNode head) {
		if(head==null || head.next==null || head.next.next==null) return false;
		if(head==head.next) return true;
		ListNode slow = head;
		ListNode fast = head.next.next;
		while(fast!=null && slow!=null) {
			if(slow==fast) return true;
			slow =slow.next;
			if(fast.next==null) return false;
			fast = fast.next.next;
		}
		return false;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值