1、并查集2、交叉链表求交点
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Main3 {
static int find(int[] p, int x) {
if(p[x] != x) {
p[x] = find(p,p[x]); // 路径压缩
}
return p[x];
}
static List<List<String>> mergeAccount(List<List<String>> accounts) {
// 在此处编写实现代码逻辑
List<List<String>> res = new ArrayList<>();
int n = accounts.size();
int[] p = new int[n]; // 祖宗节点
for(int i=0; i < n; i++) p[i] = i;
Map<String,List<Integer>> map = new HashMap<>();
for(int i=0; i < n; i++) {
for(int j=1; j < accounts.get(i).size(); j++) {
String mail = accounts.get(i).get(j);
if(map.containsKey(mail)) {
map.get(mail).add(i);
} else {
List<Integer> list = new ArrayList<>();
list.add(i);
map.put(mail, list);
}
}
}
for(String mail : map.keySet()) {
List<Integer> list = map.get(mail);
//System.out.println(list);
if(list.size() >= 2) {
int parent = find(p,list.get(0));
for(int i=0; i < list.size(); i++) {
p[find(p, list.get(i))] = parent;
}
}
}
List<Set<String>> temp = new ArrayList<>();
for(int i=0; i < n; i++) {
temp.add(new HashSet<String>());
}
for(int i=0; i < n; i++) {
int parent = find(p, i);
for(int j=1; j < accounts.get(i).size(); j++) {
temp.get(parent).add(accounts.get(i).get(j));
}
}
for(int i=0; i < n; i++) {
if(temp.get(i).size() > 0) {
List<String> mails = new ArrayList<>(temp.get(i));
//Collections.sort(mails);
res.add(mails);
}
}
return res;
}
/******************************结束写代码******************************/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int _count = Integer.parseInt(in.nextLine());
int _i = 0;
List<List<String>> _accounts = new ArrayList<List<String>>();
while (_i++ < _count) {
String _line = in.nextLine();
String[] _item = _line.split(",");
_accounts.add(Arrays.asList(_item));
}
List<List<String>> res = mergeAccount(_accounts);
Collections.sort(res, new Comparator<List<String>>() {
@Override
public int compare(List<String> o1, List<String> o2) {
String aName1 = String.join(",", o1);
String aName2 = String.join(",", o2);
return aName1.compareTo(aName2);
}
});
for (int res_i = 0; res_i < res.size(); res_i++) {
List<String> resItem = res.get(res_i);
System.out.println(String.join(",", resItem));
}
}
}
/*
[
["John", "johnsmith@mail.com", "john00@mail.com"],
["John", "johnnybravo@mail.com"],
["John", "johnsmith@mail.com", "john_newyork@mail.com"],
["Mary", "mary@mail.com"]
]
4
"John", "johnsmith@mail.com", "john00@mail.com"
"John", "johnnybravo@mail.com"
"John", "johnsmith@mail.com", "john_newyork@mail.com"
"Mary", "mary@mail.com"
输出:
"john_newyork@mail.com", "john00@mail.com", "johnsmith@mail.com"
"johnnybravo@mail.com"
"mary@mail.com"
* */
交叉单链表
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Main2 {
public static class Node {
private int data;
private Node next;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
/*请完成下面这个函数,实现题目要求的功能
当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^
******************************开始写代码******************************/
static Node getCommon(Node headA, Node headB) {
int len1 = 0, len2 = 0;
Node p = headA, q = headB;
while(p!=null) {
len1++;
p = p.next;
}
p = headB;
while(p!=null) {
len2++;
p = p.next;
}
p = headA; q = headB;
if(len1 < len2) {
int n = len2 - len1;
for(int i=0; i < n; i++) q = q.next;
}
if(len1 > len2) {
int n = len1 - len2;
for(int i=0; i < n; i++) p = p.next;
}
while(p != null && q != null) {
if(p == q) return p;
p = p.next; q = q.next;
}
return null;
}
/******************************结束写代码******************************/
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String line1 = in.nextLine();
String line2 = in.nextLine();
Node headA = null;
Node headB = null;
Map<String, Node> map = new HashMap<String, Node>();
if (line1 != null && line1.length() > 0) {
String[] array1 = line1.split(",");
headA = new Node();
headA.setData(Integer.parseInt(array1[0].split("\(")[0]));
map.put(array1[0], headA);
Node pre = headA;
for (int i = 1; i < array1.length; i++) {
Node node = map.get(array1[i]);
if (node == null) {
node = new Node();
node.setData(Integer.parseInt(array1[i].split("\(")[0]));
map.put(array1[i], node);
}
pre.next = node;
pre = node;
}
}
if (line2 != null && line2.length() > 0) {
String[] array2 = line2.split(",");
headB = map.get(array2[0]);
if (headB == null) {
headB = new Node();
headB.setData(Integer.parseInt(array2[0].split("\(")[0]));
map.put(array2[0], headB);
}
Node pre = headB;
for (int i = 1; i < array2.length; i++) {
Node node = map.get(array2[i]);
if (node == null) {
node = new Node();
node.setData(Integer.parseInt(array2[i].split("\(")[0]));
map.put(array2[i], node);
}
pre.next = node;
pre = node;
}
}
Node res = getCommon(headA, headB);
System.out.println(res == null ? res : res.getData());
}
}