现有两个递增有序的整数单链表A和B,设计一个尽可能高效的算法,求两个集合的交集C,C仍然是递增有序的单链表,并给出算法的时间和空间复杂度。例如A=(1, 3, 5, 7),B=(1, 2, 4, 5, 7),交集C=(1, 5, 7)。
时间: 2024-05-05 12:16:28 浏览: 56
算法思路:
由于A和B都是递增有序的单链表,我们可以采取类似于归并排序的思路,同时遍历A和B,找出A和B中相同的元素,将它们加入到结果集合C中。
具体实现:
1. 定义指针pA和pB分别指向A和B的头结点;
2. 定义指针pC指向结果集合C的头结点,初始为空;
3. 当pA和pB都不为空时,比较pA和pB所指向的节点的值的大小,如果相等,则将该节点加入到C中,并将pA和pB同时向后移动一位;如果不相等,则将值较小的指针向后移动一位;
4. 当pA或pB为空时,遍历结束,返回结果集合C。
算法时间复杂度为O(m+n),其中m和n分别为A和B的长度,空间复杂度为O(1)。
Python 代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def intersection(A: ListNode, B: ListNode) -> ListNode:
pA, pB, pC = A, B, ListNode(0)
res = pC
while pA and pB:
if pA.val == pB.val:
pC.next = ListNode(pA.val)
pC = pC.next
pA = pA.next
pB = pB.next
elif pA.val < pB.val:
pA = pA.next
else:
pB = pB.next
return res.next
```
测试:
```python
A = ListNode(1, ListNode(3, ListNode(5, ListNode(7))))
B = ListNode(1, ListNode(2, ListNode(4, ListNode(5, ListNode(7)))))
C = intersection(A, B)
while C:
print(C.val, end=' ')
C = C.next
```
输出:
```
1 5 7
```
阅读全文