剣指offer-面接問題52:2つのチェーンテーブルの最初の共通ノード-C++

2418 ワード

大体の考えは覚えています.何の参考にもならない
初めてパスしなかったのは冒険して2つのポインタを定義する方法を試したいからです.
//     ,     ListNode*   ListNode 
// ListNode *pNode1 = pHead1, pNode2 = pHead2; 
//     
ListNode *pNode1 = pHead1, *pNode2 = pHead2;

覚えてるよ!
マイコード:
/*
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 = 0, length2 = 0;
        ListNode * pNode1 = pHead1, * pNode2 = pHead2;
        while(pNode1 != nullptr) {
            length1++;
            pNode1 = pNode1->next;
        }
        while(pNode2 != nullptr) {
            length2++;
            pNode2 = pNode2->next;
        }
        pNode1 = pHead1;
        pNode2 = pHead2;
        if(length1 >= length2) {
            for(int i=0; inext;
            }
        } else {
            for(int i=0; inext;
            }
        }
        while(pNode1 != pNode2) {
            pNode1 = pNode1->next;
            pNode2 = pNode2->next;
        }
        return pNode1;
    }
};

2回書いたところが嫌で、改善され、改善されたコードがはっきりしていて、関数の機能が単一です.
class Solution {
public:
    ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
        int length1 = CountNodes(pHead1), length2 = CountNodes(pHead2);
        ListNode *pNode1 = pHead1, *pNode2 = pHead2;
        if(length1 >= length2) {
            pNode1 = StepForward(pHead1, length1-length2);
        } else {
            pNode2 = StepForward(pHead2, length2-length1);
        }
        while(pNode1 != pNode2) {
            pNode1 = pNode1->next;
            pNode2 = pNode2->next;
        }
        return pNode1;
    }
    int CountNodes(ListNode* pHead) {
        int result = 0;
        ListNode* pNode = pHead;
        while(pNode != nullptr) {
            result++;
            pNode = pNode->next;
        }
        return result;
    }
    ListNode* StepForward(ListNode* pHead, int num) {
        ListNode* pNode = pHead;
        for(int i=0; inext;
        }
        return pNode;
    }
};

自分が今突き詰めている精神をほめて!何か分からないことがあったら、その場で理解して、このように積み重ねていくとますます素晴らしいです!