1、 已知两个依元素值递增有序排列的链表A和B,且同一表中的元素值各不相同。构造一个单链表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列。
时间: 2024-02-13 07:02:10 浏览: 28
这道题可以使用双指针的思想来解决。假设链表 A 和链表 B 已经按照元素值递增有序排列好了,我们可以定义两个指针,分别指向链表 A 和链表 B 的头节点。然后比较两个指针所指向的节点的元素值大小,如果两个元素值相等,则将这个节点的元素插入到链表 C 的尾部,并将两个指针同时后移;如果其中一个元素值比另一个小,则将指向该元素值的指针后移,直到找到两个元素值相等的节点或者其中一个链表遍历完毕。
具体实现过程如下:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def merge_sorted_lists(A, B):
dummy_head = ListNode(0)
tail = dummy_head
p1, p2 = A, B
while p1 and p2:
if p1.val == p2.val:
tail.next = ListNode(p1.val)
tail = tail.next
p1 = p1.next
p2 = p2.next
elif p1.val < p2.val:
p1 = p1.next
else:
p2 = p2.next
return dummy_head.next
```
其中,`ListNode` 是链表节点的定义,包含一个 `val` 属性表示节点的值,一个 `next` 属性表示指向下一个节点的指针。`merge_sorted_lists` 函数接受两个链表 A 和 B 作为输入,返回一个新的链表 C,其中的元素为 A 和 B 中元素的交集,并且按照元素值递增有序排列。函数先创建一个空节点作为链表 C 的虚拟头节点,然后定义一个指针 `tail` 指向链表 C 的尾部。接着,定义两个指针 `p1` 和 `p2`,分别指向链表 A 和链表 B 的头节点。在循环中,比较 `p1` 和 `p2` 所指向的节点的元素值大小,如果两个元素值相等,则将这个节点的元素插入到链表 C 的尾部,并将 `p1` 和 `p2` 同时后移;如果其中一个元素值比另一个小,则将指向该元素值的指针后移,直到找到两个元素值相等的节点或者其中一个链表遍历完毕。最后返回虚拟头节点的下一个节点,即链表 C 的头节点。