两个有序链表的交集C++
时间: 2024-11-03 19:21:19 浏览: 24
在C++中,判断两个已排序的链表是否有交集并返回交集部分,可以采用双指针法。这种方法的基本思想是维护两个指针分别从两个链表的头部开始,同时移动。如果它们指向的节点值相等,那么这个节点就是交集的一部分;如果不等,则继续移动较大的那个节点的指针,直到其中一个链表遍历完为止。
以下是具体的算法步骤:
1. 定义两个指针,`p1` 和 `q1` 分别指向两个链表的头结点。
2. 使用 `while` 循环,当两个指针都不为null,并且指向的节点值不相等时:
a. 将第一个链表的指针向后移动一步,`p1 = p1 ? p1->next : q1;`
b. 将第二个链表的指针向后移动两步,`q1 = q1 ? q1->next->next : q1;`
3. 当找到相同的节点时,进入循环内的`while`条件不再满足,此时`p1` 或 `q1` 可能为 null 或者它们都指向了交集的部分。你可以选择任意一个作为交集的起点,然后从它开始,继续遍历这两个链表,直到其中任何一个遍历完。
以下是一个简单的C++实现:
```cpp
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
ListNode* p1 = headA, *q1 = headB;
while (p1 != q1) {
if (p1 == nullptr)
p1 = headB;
else if (q1 == nullptr)
q1 = headA;
else if (p1->val > q1->val)
p1 = p1->next;
else
q1 = q1->next->next;
}
return p1;
}
```
这里的`ListNode`结构体应该包含`val`(表示节点值)和`next`(指向下一个节点)字段。
阅读全文