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