剣指Offer-JZ 36-2つのチェーンテーブルの最初の共通ノード

6404 ワード

タイトルの説明
2つのチェーンテーブルを入力し、最初の共通ノードを見つけます.(注意入力データはチェーンテーブルなので、エラーテストデータのヒントは他の方法で表示され、入力データが正しいことを保証します)
問題を解く構想.
  • は2つのチェーンテーブルの長さを取得し、長いチェーンテーブルを2つのチェーンテーブルの長さの差のノード
  • を先に右に歩かせる.
  • さらに2つのチェーン時計を一緒に右に
  • 行きます
    コード実装
    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
            int length1 = getLength(pHead1);
            int length2 = getLength(pHead2);
            if(length1 > length2){
                pHead1 = nextN(pHead1, length1 - length2);
            }
            else{
                pHead2 = nextN(pHead2, length2 - length1);
            }
            while(pHead1 != NULL){
                if(pHead1 == pHead2){
                    return pHead1;
                }
                pHead1 = pHead1->next;
                pHead2 = pHead2->next;
            }
            // return NULL;    //   ?
        }
    private:
        //       
        int getLength(ListNode* pHead){
            if(pHead == NULL){
                return 0;
            }
            
            int length = 1;
            while(pHead = pHead->next){
                length++;
            }
            return length;
        }
        
        //     n    
        ListNode* nextN(ListNode* pHead, int n){
            while(n--){
                pHead = pHead->next;
            }
            return pHead;
        }
    };
    

    コード実装
    実行時間:3 msメモリ消費量:376 k