遍历两表求差值,谁更长谁先走,走过差值一起走,相遇即是第一公共点。 struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) { int len1 = 0,len2 = 0; struct ListNode* p1 = pHead1; struct ListNode* p2 = pHead2; for(; p1 != NULL; len1++) p1 = p1->next; //求len1 for(; p2 != NULL; len2++) p2 = p2->next; //求len2 if(len1 == 0 || len2 == 0) return NULL; //某一个链表为空,肯定没公共点,两个都空的话,就一起空呗 else if (len1 >= len2){ //若链表1更长 int dis = len1 - len2; //求链表长度差 while (dis > 0){ pHead1 = pHead1->next; dis--; } //长表先走,走到从该点开始的长度与短表相同时停下 } else{ //链表2更长,情况同上 int dis = len2 - len1; while (dis > 0){ pHead2 = pHead2->next; dis--; } } //长表先走,走到从该点开始的长度与短表相同时停下 while(pHead1 != pHead2){ //两表一起走,相遇时停下 pHead1 = pHead1->next; pHead2 = pHead2->next; } return pHead1; //当然,return pHead2也可以 }