C++求两个有序集合的交 函数定义为 void inter(linknode *a,linknode *b,linknode *&c)
时间: 2024-12-02 07:17:51 浏览: 19
在C++中,当你想要找出两个已排序链表的交集时,可以定义一个`void inter(linknode *a, linknode *b, linknode *&c)`函数,其中`linknode`表示链表节点结构,`&c`是一个指向指针的引用,用于返回结果链表。这个函数通常会利用双指针策略,同时遍历两个链表。
步骤大致如下:
1. 初始化两个指针`p1`和`p2`分别指向`a`和`b`的头部。
2. 如果其中一个链表为空,则直接将另一个链表复制到结果链表`c`。
3. 使用循环或递归的方式遍历链表,当`p1`和`p2`都指向链表中相同的元素时,将该元素添加到结果链表`c`,然后移动`p1`和`p2`到下一个相同位置的元素。
4. 当一个链表遍历完后,另一个链表还有剩余元素未处理,说明这两个链表的交集就是剩下的部分。
5. 遇到`p1`或`p2`为NULL的情况,说明遍历结束,更新`c`的指针使其指向当前非空节点。
6. 返回结果链表`c`的指针。
以下是简单伪代码示例:
```cpp
void inter(linknode *a, linknode *b, linknode *&c) {
linknode* p1 = a;
linknode* p2 = b;
linknode* resultHead = nullptr; // 结果链表头
linknode* resultTail = nullptr;
while (p1 && p2) {
if (p1->data == p2->data) {
if (!resultHead) { // 空链表或第一次找到元素
resultHead = new linknode(p1->data);
resultTail = resultHead;
} else {
resultTail->next = new linknode(p1->data);
resultTail = resultTail->next;
}
p1++; p2++;
} else if (p1->data < p2->data) {
p1++;
} else {
p2++;
}
}
c = resultHead ? resultHead : (p1 || p2) ? p1 : p2;
}
```
阅读全文