题目描述:
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
本题知识点:
链表
解题思路:
- 先固定一个链表,逐个遍历第二个链表与第一个链表进行对比,如果遍历没有发现相同结点,将第一个链表后移一位,再遍历第二个链表,直到找到相同结点。
- 逐个遍历两个链表并进行对比,如果其中一个链表遍历完就将头转到第二个链表,继续遍历,最多只需将两个链表遍历两次即可。例如链表a:0->1->2->3->4->5->NULL,链表b:x->y->z->4->5->NULL。
p1:0->1->2->3->4->5->NULL->x->y->z->4->5->NULL
p2:x->y->z->4->5->NULL->0->1->2->3->4->5->NULL
代码:
1.
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(!pHead1 || !pHead2)
return NULL;
ListNode* copy = pHead2;
while(pHead1)
{
while(pHead2)
{
if(pHead1 == pHead2)
return pHead1;
else
pHead2 = pHead2->next;
}
pHead1 = pHead1->next;
pHead2 = copy;
}
return NULL;
}
};
2.
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(!pHead1 || !pHead2)
return NULL;
ListNode* copy1 = pHead1;
ListNode* copy2 = pHead2;
while(copy1 != copy2)
{
copy1 = copy1->next;
copy2 = copy2->next;
if(copy1 != copy2)
{
if(!copy1)
copy1 = pHead2;
if(!copy2)
copy2 = pHead1;
}
}
return copy1;
}
};