题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
解题思路
- 获取2个链表的长度,然后让长的链表先向右走过2个链表长度差个的结点
- 再2个链表一起向右走
代码实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int length1 = getLength(pHead1);
int length2 = getLength(pHead2);
if(length1 > length2){
pHead1 = nextN(pHead1, length1 - length2);
}
else{
pHead2 = nextN(pHead2, length2 - length1);
}
while(pHead1 != NULL){
if(pHead1 == pHead2){
return pHead1;
}
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
// return NULL; // 多余?
}
private:
// 获取链表长度
int getLength(ListNode* pHead){
if(pHead == NULL){
return 0;
}
int length = 1;
while(pHead = pHead->next){
length++;
}
return length;
}
// 向右走 n 个结点
ListNode* nextN(ListNode* pHead, int n){
while(n--){
pHead = pHead->next;
}
return pHead;
}
};
代码实现
运行时间:3ms
占用内存:376k