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 20:30:10 浏览: 9
这段代码是一个解决链表找到第一个公共节点的问题的函数`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* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针
可以使用双指针法,一个指针指向小于x的结点,一个指针指向大于等于x的结点,最后将两部分链表拼接起来即可。具体代码如下:
ListNode* partition(ListNode* pHead, int x) {
ListNode* smallHead = new ListNode(0); // 小于x的结点链表的头结点
ListNode* smallTail = smallHead; // 小于x的结点链表的尾结点
ListNode* bigHead = new ListNode(0); // 大于等于x的结点链表的头结点
ListNode* bigTail = bigHead; // 大于等于x的结点链表的尾结点
ListNode* cur = pHead;
while (cur != nullptr) {
if (cur->val < x) {
smallTail->next = cur;
smallTail = cur;
} else {
bigTail->next = cur;
bigTail = cur;
}
cur = cur->next;
}
// 拼接两部分链表
smallTail->next = bigHead->next;
bigTail->next = nullptr;
ListNode* newHead = smallHead->next;
delete smallHead;
delete bigHead;
return newHead;
}