题目描述
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
问题分析
首先判断两个链表的头节点如果有一个为空,那么直接返回NULL。接下来两个链表分别从头部开始走,当走到自己链表的尾部时,跳到另一个链表的头节点开始继续走,当两个指针相遇时,该节点就是两个链表的交点。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB)
return NULL;
ListNode* cur1 = headA;
ListNode* cur2 = headB;
while(cur1 || cur2){
if(cur1 == cur2)
return cur1;
if(!cur1)
cur1 = headB;
else
cur1 = cur1->next;
if(!cur2)
cur2 = headA;
else
cur2 = cur2->next;
}
return NULL;
}
};