public class TwoLinkPublicNode52 {
static class Node {
int val;
Node next;
public Node(int val){
this.val = val;
}
@Override
public String toString() {
return "Node{" +
"val=" + val +
", next=" + next +
'}';
}
}
public static void main(String[] args) {
Node node11 = new Node(1);
Node node12 = new Node(2);
Node node13 = new Node(3);
Node node14 = new Node(4);
node11.next = node12;
node12.next = node13;
node13.next = node14;
Node node20 = new Node(0);
Node node21 = new Node(2);
Node node22 = new Node(1);
Node node23 = new Node(3);
Node node24 = new Node(4);
node20.next = node21;
node21.next = node22;
node22.next = node23;
node23.next = node24;
System.out.println(findFirst(node11, node20).val);
}
private static Node findFirst(Node root1, Node root2) {
Node p1 = root1, p2 = root2;
int num1 = 0, num2 = 0;
while (p1 != null) {
num1++;
p1 = p1.next;
}
while (p2 != null) {
num2++;
p2 = p2.next;
}
p1 = root1;
p2 = root2;
int diff = 0;
if (num2 > num1) {
diff = num2 - num1;
while (diff != 0) {
p2 = p2.next;
diff--;
}
} else {
diff = num1 - num2;
while (diff != 0) {
p1 = p1.next;
diff--;
}
}
while (p1.val != p2.val) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}
解释:易知第一个公共节点往后的所有节点两个链表都一样,长度也一样;那么计算出两个链表长度的差minus,较长的链表先往前走minus步,然后两个链表同时往前走,边走边比较,直到找到第一个相等的节点