已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。 要求S3中没有重复元素。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列
时间: 2024-12-14 11:24:21 浏览: 12
两个有序链表序列的合并_C语言_
5星 · 资源好评率100%
要解决这个问题,可以使用哈希集合(HashSet)来存储已见过的元素,同时遍历两个链表S1和S2。当遇到的节点值不在哈希集中时,将其添加到结果链表S3并加入哈希集。如果遇到的节点值已经在哈希集中,说明它是重复的,直接跳过即可。以下是Python的一个示例算法:
```python
def merge_sorted_lists(S1, S2):
# 创建一个新的链表头结点和哈希集合
dummy = ListNode(0)
hash_set = set()
# 遍历两个链表
current = dummy
while S1 and S2:
if S1.val not in hash_set:
current.next = S1
hash_set.add(S1.val)
S1 = S1.next
elif S2.val not in hash_set:
current.next = S2
hash_set.add(S2.val)
S2 = S2.next
else:
continue
current = current.next
# 如果其中一个链表还有剩余未处理,将其添加到结果链表末尾
if S1:
current.next = S1
elif S2:
current.next = S2
return dummy.next
# 定义链表节点类
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
```
在这个算法中,我们首先创建一个虚拟头结点`dummy`,以便于操作链表。然后,我们通过`current`指针跟踪当前链表的位置,并在遇到的新节点值有效时将其添加到结果链表中。`hash_set`用于存储已经遇到的节点值,避免重复。
阅读全文