1. 程式人生 > >兩個鏈表第一個公共點

兩個鏈表第一個公共點

back rst cnblogs title highlight span solution 結點 clas

題目描述

輸入兩個鏈表,找出它們的第一個公共結點。 思路:用兩個指針掃描”兩個鏈表“,最終兩個指針到達 null 或者到達公共結點。 代碼所基於的想法是,將兩個鏈表L1和L2進行拼接,得到L1+L2和L2+L1兩個拼接結果。這兩個拼接後的鏈表長度是一致的,那麽逐個判斷即可。
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode *p1=pHead1;
        ListNode *p2=pHead2;
        while(p1!=p2) {
            p1=(p1==NULL ? pHead2:p1->next);
            p2=(p2==NULL ? pHead1: p2->next);
        }
        return p1;
    }
};

長度相同有公共結點,第一次就遍歷到;沒有公共結點,走到尾部NULL相遇,返回NULL
長度不同有公共結點,第一遍差值就出來了,第二遍一起到公共結點;沒有公共,一起到結尾NULL。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode* p=pHead1;
        while(p!=NULL){
            ListNode* q=pHead2;
            while(q!=NULL){
                if(p==q){
                    return p;
                }
                q=q->next;
            }
            p=p->next;
        }
        return p;
    }
};

  

兩個鏈表第一個公共點