/*求兩個單鏈表相交的第一個節點嗎,對第一個鏈表遍歷,計算長度len1,同時保存最後一個節點的地址。 對第二個鏈表遍歷,計算長度len2,同時檢查最後一個節點是否合第一個鏈表的最後一個節點相同,若是不相同,則不相交,結束。兩個鏈表均從頭節點開始,假設len1大於len2. 那麼將第一個鏈表先遍歷len1-len2個節點,此時兩個鏈表當前節點到第一個節點的距離就相等了,而後一塊兒向後遍歷,直到兩個節點的地址相同。 時間複雜度爲O(len1+len2) */ public static Node getFristCommonNode(Node head1, Node head2){ if(head1==null || head2 == null){ return null; } int len1 = 1; Node tail1 = head1; while (tail.next != null){ tail1 = tail1.next; len1++; } int len2 = 1; Node tail2 = head2; while (tail2.next != null){ tail2 = tail2.next; len2++; } //若是最後一個節點不相同,則直接結束。 if(tail1 != tail2){ return null; } Node n1 = head1; Node n2 = head2; //略過較長鏈表多餘的部分 if(len1 > len2){ int k = len1 - len2; while (k != 0){ n1 = n1.next; k--; } }else{ int k = len2 - len1; while (k!=0){ n2=n2.next; k--; } } //一塊兒向後遍歷,直到找到交點 while(n1 != n2){ n1 = n1.next; n2 = n2.next; } return n1; }