剑指offer-两个链表的第一个公共节点

题目描述

 

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

 

解题思路

 

分析可得如果两个链表有公共节点,那么公共节点出现在两个链表的尾部,即从某一节点开始,两链表之后的节点全部相等。可以首先遍历两个链表得出各自的长度l1、l2,然后让长度较大的链表向前走l(max)-l(min)步,接着两个链表分别向后遍历,如果遇到节点值相等的就返回,直到指针指向NULL。

 

代码

 

 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         int l1 = GetListLenth(pHead1);
13         int l2 = GetListLenth(pHead2);
14         if(l1 >= l2){
15             int ls = l1-l2;
16             while(ls-- > 0)
17                 pHead1 = pHead1->next;
18         }
19         else{
20             int ls = l2-l1;
21             while(ls-- > 0)
22                 pHead2 = pHead2->next;
23         }
24         while(pHead1 != NULL){
25             if(pHead1->val == pHead2->val)
26                 return pHead1;
27             else{
28                 pHead1 = pHead1->next;
29                 pHead2 = pHead2->next;
30             }
31         }
32         return pHead1;
33     }
34     int GetListLenth(ListNode* pHead){
35         ListNode* p = pHead;
36         int l = 0;
37         while(p != NULL){
38             l++;
39             p = p->next;
40         }
41         return l;
42     }
43 };

 

posted @ 2018-03-29 10:54  FlyingWarrior  阅读(182)  评论(0编辑  收藏  举报