[オファー] [52] [二つのリストの第1の共通のノード]

タイトル説明

  二つの入力リスト、彼らの最初の共通のノードを見つけます。図6は、共通のノードです。

牛が質問がネットワークに対処はねのけます

アイデア解析

  二つのリストの共通ノードがある場合は、共通のノードは、二つのリストの最後に表示されます。我々は前進尾からの二つのリストを比較し始める場合は、最後の1と同じノードは、我々は、ノードを探しています。

  1. この問題を解決するには、次の2つのノードリストは、2つのスタックにある、二つのリストをテール・ノードように、スタックの最上部に2つのスタックを、2つのスタック・ノードを比較することは同じです。もしそうなら、あなたが最後の1と同じノードを見つけるまで、その次に比較され、スタックのポップ・スタックの最上位に置きます。
  2. まず、長い、短いリストのリスト数以上のノードより長いリストを知ることができるようになりますこれは、その長さを取得するために2つのリストをトラバース。その後、第二のパス、およびいくつかのステップの長いリストの上に移動し、2つのリストに同時に横断するときは、最初のものと同じノードは、その第1の共通のノードを発見されました。

テストケース

  1. 官能試験:2つの入力が共通ノードリストがあります。リストの中央に第1の共通ノード、リストの終わりに第1の共通のノードを、最初のノードがリンクされたリストの先頭の共通ノードである; NO共通入力二つのリストノード。
  2. 特別な入力テスト:リストヘッドポインタの入力ノードは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() {

    }
}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/offer52-liang-ge-lian-biao-de-di-yi-ge-gong-gong-j.html