找出两个链表的第一个公共节点
使用四种不同的方法来找出两个链表的第一个公共节点,用C++代码进行实现。
问题描述
给定两个链表,找出它们的第一个公共节点。
方法一:使用集合
这种方法的主要思路是,我们先遍历第一个链表,并将每个节点加入到一个集合中。然后,我们遍历第二个链表,当我们在集合中找到了一个节点,我们就知道这是两个链表的第一个公共节点。
代码实现如下:
ListNode* findFirstCommonNodeBySet(ListNode *list1, ListNode *list2){
unordered_set<ListNode*> set1;
while (list1 != nullptr){
set1.insert(list1);
list1 = list1 -> next;
}
while (list2 != nullptr){
if (set1.find(list2) != set1.end()){
return list2;
}
list2 = list2->next;
}
return nullptr;
}
方法二:使用栈
在这种方法中,我们将两个链表的所有节点都压入两个不同的栈。然后,我们同时从两个栈的顶部弹出节点,直到找到两个不相同的节点。最后一个弹出的相同节点就是我们要找的第一个公共节点。
代码实现如下:
ListNode*