判斷2個連結串列是否相交,如果相交,求出交點
阿新 • • 發佈:2018-12-21
如果2個連結串列相交,一定有相同的尾結點
思路:分別遍歷找到尾結點,比較,若相同則相交,否則不相交。如果相交,求出交點
public class XiangJiao { public static void main(String[] args){ Node p1=new Node(5); Node p2=new Node(3); Node p3=new Node(9); Node p4=new Node(2); p1.next=p2; p2.next=p3; p3.next=p4; Node q1=new Node(6); Node q2=new Node(4); Node q3=new Node(7); Node q4=new Node(8); Node q5=new Node(2); q1.next=q2; q2.next=q3; q3.next=q4; q4.next=q5; System.out.println(new XiangJiao().isIntersect(p1,q1)); Node n=getMeetNode(p1,q1); System.out.println(n.data); } public boolean isIntersect(Node h1,Node h2){ if(h1==null||h2==null) return false; Node t1=h1; //找連結串列1的尾結點 while(t1.next!=null) t1=t1.next; Node t2=h2; //找連結串列2的尾結點 while(t2.next!=null) t2=t2.next; return t1.data==t2.data; } //判斷是否相交,如果相交找出交點 public static Node getMeetNode(Node h1,Node h2){ if(h1==null||h2==null) return null; Node t1=h1; int len1=1; //找連結串列1的尾結點 while(t1.next!=null) { t1 = t1.next; len1++; } Node t2=h2; int len2=1; //找連結串列2的尾結點 while(t2.next!=null) { t2 = t2.next; len2++; } //如果不相交 if(t1.data!=t2.data){ return null; } Node t_1=h1; Node t_2=h2; //找出較長的,先遍歷 if(len1>len2){ int d=len1-len2; while (d!=0){ t_1=t_1.next; d--; } }else{ int d=len2-len1; while (d!=0){ t_2=t_2.next; d--; } } while(t_1.data!=t_2.data){//同時遍歷 t_1=t_1.next; t_2=t_2.next; } return t_1; } }