题目描述:
题目思路:这个题目中的链表其实是单链表,数值上存在环,所以不能通过快慢指针去找环了,只能通过设置两个指针,双层循环的方式去一个个的验证。
1.外层循环指针p1向后移动一个单位,内层循环指针p2从p1.next开始向后一直找到和p1.val值相等的元素,然后开始验证从p1和p2开始是否存在数值上的环
2.如果验证满足数值环的条件则将环的值记录下来,计算最大公约数。
3.如果外层循环完成都没有找到环则没有环,返回-1
代码实现:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return int整型
*/
public int gcdInCycle (ListNode head) {
// write code here
boolean isCycle = false;
int resval = 1;
//第一次可能出现环的值
int firstval=0;
ArrayList<Integer> intarr = new ArrayList<Integer>(0);
//设置双指针
ListNode p1 = head;
ListNode p2 = head;
//p2要从p1处向后一直执行到null,看是否存在环
while (p1 != null) {
p2 = p1.next;
//内层循环,找到p1.val和p2.val相等的结点
while (p2 != null && p2.val != p1.val) {
p2 = p2.next;
}
if (p2 != null && p2.val == p1.val) { //检测是否存在数值环
ListNode mayfirstP = p1;
int nowval = p2.val;
boolean isequal = true;
while (p1.next.val != nowval) {
p1 = p1.next;
p2 = p2.next;
if (p2 == null || p1.val != p2.val) {
isequal = false;
}
}
if (isequal) { //此时存在环
isCycle = true;
//存储所有值
int cycleval = mayfirstP.val;
intarr.add(cycleval);
while (cycleval != mayfirstP.next.val) {
System.out.println(mayfirstP.next.val);
mayfirstP = mayfirstP.next;
intarr.add(mayfirstP.val);
}
break;
}
}
p1=p1.next;
}
if (!isCycle) {
return -1;
} else {
//计算最大公约数
System.out.println(intarr.toString());
for (int i = intarr.get(0); i > 0; i--) {
boolean isfinded = true;
for (int arrval : intarr) {
if (arrval % i != 0) {
isfinded = false;
break;
}
}
if (isfinded) {
resval = i;
break;
}
}
return resval;
}
}
}
刷题链接: