两个单链表相交,可以理解为(即)一个单链表的某一结点指向了另一单链表的某一结点。当我们实现判断单链表是否有环的方法后(利用快慢指针判断单链表是否有环),一个自然的想法便是,先将两个单链表分别在首个环节点处拆开(没有环则是在末尾拆开等效于没有拆),再将其中一个单链表首尾相接,然后从另一个单链表的头结点开始判断其是否有环,如有则两个单链表相交。
public class Node {
int value;
Node next;
public Node getRing(Node head) {
Node slow = head;
Node fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
public void deRing(Node head) {
Node ringNode = getRing(head);
if (ringNode == null) {
return;
}
Node p = ringNode;
while (p.next != ringNode) {
p = p.next;
}
p.next = null;
}
public void reRing(Node head) {
Node p = head;
while (p.next != null) {
p = p.next;
}
p.next = head;
}
public Node answer(Node A, Node B) {
deRing(A);
deRing(B);
reRing(A);
return getRing(B);
}
}
利用新实现的Node类(单链表的Java简单实现)可以检验该方法。
public class test {
public static void main(String[] args) {
Node a=new Node(1);
Node b=new Node(2);
int[] arr= {101,202,303,404,505,606};
for (int i = 0; i < arr.length; i++) {
a.add(arr[i]);
}
b.add(0);b.add(9);
b.add(a.get(5));
a.delete(a.get(5));
if(Node.crossing(a,b)!=null)
System.out.println(Node.crossing(a,b).val());
else System.out.println("null");
}
}
文章内容原创,转载注明作者。