题目 : 输入两个链表,找出它们的第一个公共结点。
思路 :
如果有公共节点
1)若两个链表长度相等,那么遍历一遍后,在某个时刻,p1 == p2
2)若两个链表长度不相等,那么短的那个链表的指针pn(也就是p1或p2) 必先为null,那么这时再另pn = 链表头节点。经过一段时间后, 则一定会出现p1 == p2。如果没有公共节点:这种情况可以看成是公共节点为null,顾不用再考虑。
1、java版本
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while (p1.value != p2.value) {
if (p1 != null) {
p1 = p1.next;
}
if (p2 != null) {
p2 = p2.next;
}
if (p1 != p2) {
if (p1 == null) {
p1 = pHead1;
}
if (p2 == null) {
p2 = pHead2;
}
}
}
return p1;
}
2、c++版本
//
// Created by stephen on 2021/3/13.
//
#include <vector>
#include <algorithm>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode *cur1 = pHead1;
ListNode *cur2 = pHead2;
while (cur1){
while (cur2){
if (cur1 == cur2)
return cur1;
cur2 = cur2->next;
}
cur2 = pHead2;
cur1 = cur1->next;
}
return NULL;
}
};