两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。
生活随笔
收集整理的這篇文章主要介紹了
两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、蠻力法:
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { 12 if(pHead1==NULL||pHead2==NULL) 13 return NULL; 14 ListNode* p1; 15 ListNode* p2; 16 for(p1=pHead1;p1!=NULL;p1=p1->next){ 17 for(p2=pHead2;p2!=NULL;p2=p2->next){ 18 if(p1==p2) 19 return p1; 20 } 21 } 22 return NULL; 23 } 24 };2、
從鏈表的定義可以看出,這兩個(gè)鏈表是單鏈表,如果兩個(gè)鏈表有公共節(jié)點(diǎn),那么這兩個(gè)鏈表從某一節(jié)點(diǎn)開(kāi)始,它們的m_pNext都指向同一個(gè)節(jié)點(diǎn),之后它們所有的節(jié)點(diǎn)都是重合的,不可能再出現(xiàn)分叉。所以拓?fù)湫螤羁雌饋?lái)是Y型。
?
一個(gè)簡(jiǎn)單的方法是:首先遍歷兩個(gè)鏈表得到它們的長(zhǎng)度,就能知道哪個(gè)鏈表比較長(zhǎng),以及長(zhǎng)的鏈表比短的鏈表多幾個(gè)節(jié)點(diǎn)。在第二次遍歷的時(shí)候,先在較長(zhǎng)的節(jié)點(diǎn)上走若干步,接著同時(shí)在兩個(gè)鏈表上遍歷,找到的第一個(gè)相同的節(jié)點(diǎn)就是它們的公共的節(jié)點(diǎn)。
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { 12 if(pHead1==NULL||pHead2==NULL) 13 return NULL; 14 int l1=0,l2=0; 15 ListNode* p1=pHead1; 16 ListNode* p2=pHead2; 17 while(p1!=NULL){ 18 l1++; 19 p1=p1->next; 20 } 21 while(p2!=NULL){ 22 l2++; 23 p2=p2->next; 24 } 25 int d1=0,d2=0; 26 if(l1>l2) 27 d1=l1-l2; 28 if(l1<l2) 29 d2=l2-l1; 30 p1=pHead1; 31 p2=pHead2; 32 while(d1!=0){ 33 p1=p1->next; 34 d1--; 35 } 36 while(d2!=0){ 37 p2=p2->next; 38 d2--; 39 } 40 while(p1!=NULL&&p2!=NULL){ 41 if(p1==p2) 42 return p1; 43 p1=p1->next; 44 p2=p2->next; 45 } 46 return NULL; 47 } 48 };?
轉(zhuǎn)載于:https://www.cnblogs.com/zl1991/p/4775888.html
總結(jié)
以上是生活随笔為你收集整理的两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: npm打包项目报错:npm ERR! A
- 下一篇: VB 文件操作