兩個鏈表第一個公共點
阿新 • • 發佈:2017-08-19
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; } };
兩個鏈表第一個公共點