初级算法:回文链表

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

示例 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.csdn.net/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;
	}
发布了30 篇原创文章 · 获赞 0 · 访问量 1132

猜你喜欢

转载自blog.csdn.net/qq_41220834/article/details/83420107