class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *ta = pHead1, *tb = pHead2; while (ta != tb) { ta = ta ? ta->next : pHead2; tb = tb ? tb->next : pHead1; } return ta; } };
时间: 2024-04-16 08:30:10 浏览: 69
这段代码是一个解决链表找到第一个公共节点的问题的函数`FindFirstCommonNode`,它接受两个链表的头节点`pHead1`和`pHead2`作为参数,并返回它们的第一个公共节点。
在函数内部,定义了两个指针`ta`和`tb`,分别指向两个链表的头节点。然后通过一个循环来遍历链表,直到找到第一个相等的节点为止。
在循环中,首先判断`ta`和`tb`是否相等,如果相等则表示找到了第一个公共节点,直接返回该节点。
如果`ta`不为空,则将`ta`指向它的下一个节点,否则将`ta`指向`pHead2`,即切换到第二个链表继续遍历。
同样地,如果`tb`不为空,则将`tb`指向它的下一个节点,否则将`tb`指向`pHead1`,即切换到第一个链表继续遍历。
通过这种方式,当两个链表存在公共部分时,循环最终会找到第一个公共节点,并返回它。如果两个链表没有公共部分,循环最终会结束,并且返回空指针。
相关问题
ListNode* ReverseList(ListNode* pHead)
您好!要反转一个链表可以使用迭代或递归的方法。下面是使用迭代的方法来反转链表的代码示例:
```cpp
ListNode* ReverseList(ListNode* pHead) {
ListNode* prev = nullptr;
ListNode* curr = pHead;
while (curr != nullptr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
这段代码使用三个指针 `prev`、`curr` 和 `next` 分别表示当前节点、前一个节点和下一个节点。在循环中,我们不断将当前节点的 `next` 指针指向前一个节点,然后更新三个指针的位置。
希望对您有所帮助!如果还有其他问题,请随时提问。
ListNode* deleteDuplication(ListNode* pHead)
`ListNode* deleteDuplication(ListNode* pHead)` 是一个常见的链表操作函数,其目的是删除给定单向链表(由头节点 `pHead` 表示)中的所有重复元素。在这个问题中,每个节点包含一个整数值和指向下一个节点的指针。
该函数通常会通过遍历链表的方式工作,对于当前节点,如果它的值已经在之前遇到过的节点中出现过,则将这个节点从链表中移除,只保留第一次出现的节点。这需要维护一个集合(如哈希集)来跟踪已见的值,遇到相同的值就不再向前移动而是直接跳到下一个未检查的节点。
这里是一个简单的伪代码实现:
```cpp
ListNode* deleteDuplication(ListNode* pHead) {
if (!pHead || !pHead->next) return pHead; // 如果链表为空或只有一个节点,无需处理
std::unordered_set<int> seenValues;
ListNode* current = pHead;
while (current) {
if (seenValues.find(current->val) != seenValues.end()) { // 如果值已存在集合中
ListNode* nextToSkip = current->next;
delete current; // 删除当前节点
current = nextToSkip; // 更新当前节点为下一个非重复节点
} else {
seenValues.insert(current->val); // 添加当前值到集合中
current = current->next;
}
}
return pHead;
}
阅读全文