请判断一个链表是否为回文链表。
示例 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。那这个是不是巧合呢? 首先我们要理解的是循环的次数代表的是什么。
- 每次循环,对于B这个慢指针来说,意味着走了一个单位长度。
- 而对于A来说,走了两个单位长度。
- 那么二者第一次相遇必然是在A走了2圈,B走了1圈的时候。
- 假如A的速度是B的3倍,那么二者第一次相遇是在A走了3圈,B走了1圈的时候。
- 同理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;
}