问题描述:
样例如下:
代码如下:
import java.util.HashSet;
//给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,
// 该列表是上述链表中整型值的一个子集。
//返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)
// 构成的集合。
//
public class NumComponents {
static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public static int numComponents(ListNode head, int[] nums) {
HashSet<Integer> hashSet = new HashSet<>();//利用hash表提高查找速度
for (int i = 0; i <nums.length ; i++) {
hashSet.add(nums[i]);
}
int ans = 0; //记录组件个数
int temp = 0;//记录每个组件中的元素个数
ListNode head1 = head;
while (head1!=null){
if (hashSet.contains(head1.val)){
temp++;
}else {
if (temp>=1) ans++;
temp = 0;
}
if (head1.next != null) head1 = head1.next;
else {
if (temp>=1) ans++;
break;
}
}
return ans;
}
public static void main(String[] args) {
ListNode head = new ListNode(0);
head.next = new ListNode(1);
head.next.next = new ListNode(2);
head.next .next.next= new ListNode(3);
head.next.next.next.next = new ListNode(4);
int[] nums = {0,3,1,4};
System.out.println(numComponents(head,nums));
}
}
结果如下: