劍指offer 面試題52 兩個鏈表的第一個公共節點

題目描述
輸入兩個鏈表,找出它們的第一個公共結點。
如果是暴力法的話(類似字符串匹配),複雜度o(m*n)
利用棧,從尾部開始遍歷的話,複雜度o(m+n) 空間複雜度o(m+n)
下面的方法,o(m+n), 不需要棧,首先記錄兩個鏈表的長度,較長的先走abs(l1-l2)步,然後再一起走,直到找到第一個公共節點。

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        int pLength1=0,pLength2=0;
        ListNode* pIter1=pHead1;
        ListNode* pIter2=pHead2;
        // 先遍歷一輪,記錄長度
        while (pIter1!=NULL)
        {   
           pLength1++;
           pIter1=pIter1->next;
        }
        while(pIter2!=NULL) {
           pLength2++;
           pIter2=pIter2->next;
        }
        pIter1=pHead1;
        pIter2=pHead2;
        // 較長的先走abs(l1-l2)步
        if(pLength1>pLength2) {
            int i=pLength1-pLength2;
            while(i>0) {
                pIter1=pIter1->next;
                i--;
            }
        } else {
            int i=abs(pLength1-pLength2);
            while(i>0) {
                pIter2=pIter2->next;
                i--;
            }
        }
        // 再一起走
        while(pIter2!=NULL&&pIter1!=NULL) {
            if(pIter2==pIter1) {
                return pIter2;
            }
            pIter1=pIter1->next;
            pIter2=pIter2->next;
        }
        return NULL;
    }
};
發佈了94 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章