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、
从链表的定义可以看出,这两个链表是单链表,如果两个链表有公共节点,那么这两个链表从某一节点开始,它们的m_pNext都指向同一个节点,之后它们所有的节点都是重合的,不可能再出现分叉。所以拓扑形状看起来是Y型。
一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。
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(l1next;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 };