剑指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 };