两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。

时间:2020-12-26 11:05:16

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(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 };