假设以两个元素依值递增有序的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中元素也依值递增有序。试对单链表编写求C的算法。(也可利用线性表A的空间实现)
时间: 2024-05-08 11:15:52 浏览: 140
算法思路:
1. 新建一个空链表C,作为结果集合。
2. 初始化指针Pa和Pb,分别指向链表A和B的首元素。
3. 当Pa和Pb均不为空时,比较Pa和Pb所指向元素的大小。
4. 如果Pa指向的元素小于Pb指向的元素,则Pa向后移动一位,否则Pb向后移动一位。
5. 如果Pa和Pb所指向的元素相等,则将该元素插入链表C中,Pa和Pb均向后移动一位。
6. 当Pa或Pb为空时,算法结束,返回链表C。
Python 代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def intersection(A: ListNode, B: ListNode) -> ListNode:
dummy = ListNode(0)
tail = dummy
pa, pb = A, B
while pa and pb:
if pa.val < pb.val:
pa = pa.next
elif pa.val > pb.val:
pb = pb.next
else:
tail.next = ListNode(pa.val)
tail = tail.next
pa = pa.next
pb = pb.next
return dummy.next
```
时间复杂度:$O(m+n)$,其中m和n分别是链表A和B的长度。因为每个元素只会被遍历一次。
阅读全文