【剑指offer】两个链表的第一个公共结点

题目链接:两个链表的第一个公共结点


题意:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

 

题解:先计算两个链表的长度。让长的先走‘长度差’个节点。然后一起向后走,就能遇到公共节点。

既然是单链表的第一个公共节点,在公共节点前必然是不会重复的。所以可以砍掉长链表的头。

 

代码:

 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         ListNode* p1 = pHead1;
13         ListNode* p2 = pHead2;
14         int len1 = 0,len2 = 0;
15         //链表长度
16         while(p1){    len1++; p1=p1->next;}
17         while(p2){    len2++; p2=p2->next;}
18         //相差
19         int sub = abs(len1-len2);
20         if(len1 > len2){
21             while(sub){
22                 pHead1 = pHead1->next;sub--;    //链表1先走
23             }
24         }
25         else{
26             while(sub){
27                 pHead2 = pHead2->next;sub--;    //链表2先走
28             }
29         }
30         //同时向后走
31         while(pHead1){
32             if(pHead1 == pHead2)    return pHead1;
33             pHead1 = pHead1->next;
34             pHead2 = pHead2->next;
35         }
36         return NULL;
37     }
38 };
原文地址:https://www.cnblogs.com/Asumi/p/12416543.html