タイトル説明
二つの入力リスト、彼らの最初の共通のノードを見つけます。図6は、共通のノードです。
アイデア解析
二つのリストの共通ノードがある場合は、共通のノードは、二つのリストの最後に表示されます。我々は前進尾からの二つのリストを比較し始める場合は、最後の1と同じノードは、我々は、ノードを探しています。
- この問題を解決するには、次の2つのノードリストは、2つのスタックにある、二つのリストをテール・ノードように、スタックの最上部に2つのスタックを、2つのスタック・ノードを比較することは同じです。もしそうなら、あなたが最後の1と同じノードを見つけるまで、その次に比較され、スタックのポップ・スタックの最上位に置きます。
- まず、長い、短いリストのリスト数以上のノードより長いリストを知ることができるようになりますこれは、その長さを取得するために2つのリストをトラバース。その後、第二のパス、およびいくつかのステップの長いリストの上に移動し、2つのリストに同時に横断するときは、最初のものと同じノードは、その第1の共通のノードを発見されました。
テストケース
- 官能試験:2つの入力が共通ノードリストがあります。リストの中央に第1の共通ノード、リストの終わりに第1の共通のノードを、最初のノードがリンクされたリストの先頭の共通ノードである; NO共通入力二つのリストノード。
- 特別な入力テスト:リストヘッドポインタの入力ノードはnullptrです。
Javaコード
public class Offer052 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
return Solution1(pHead1,pHead2);
}
/**
* 利用长度关系
* @param pHead1
* @param pHead2
* @return
*/
private static ListNode Solution1(ListNode pHead1, ListNode pHead2) {
int listLength1 = getListLength(pHead1);
int listLength2 = getListLength(pHead2);
int dif = listLength1-listLength2;
ListNode longList = pHead1;
ListNode shortList = pHead2;
if(listLength1<listLength2) {
longList = pHead2;
shortList = pHead1;
dif = listLength2-listLength1;
}
for(int i=0;i<dif;i++) {
longList = longList.next;
}
while(longList!=null && shortList!=null && longList!=shortList) {
longList = longList.next;
shortList = shortList.next;
}
ListNode firstCommonFirst = longList;
return firstCommonFirst;
}
private static int getListLength(ListNode pHead1) {
int length = 0;
while(pHead1!=null) {
length++;
pHead1 = pHead1.next;
}
return length;
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}