单链表合成(去重复值)

将两个递增有序的单链表合并成一个递增有序的单链表,要求利用原表空间(注意重复值只保留一个)。输出合并后的单链表。设数据结点的值域为整型

输入格式:

输入n个有序的整数(无重复值),以0做结束,分别创建单链表A和B;

输出格式:

输出合并后的单链表,数据之间用一个空格分隔。

输入样例:

在这里给出一组输入。例如:

4 6 8 10 0
1 2 3 4 5 6 7 0

输出样例:

在这里给出相应的输出。例如:

1 2 3 4 5 6 7 8 10

# 定义链表节点类
class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

# 定义单向链表类
class LinkedList:
    def __init__(self):
        self.head = Node()  # 初始化带头结点

    # 向链表添加节点
    def append(self, data):
        new_node = Node(data)
        cur = self.head
        while cur.next:  # 找到链表的尾部
            cur = cur.next
        cur.next = new_node

    # 打印链表的所有元素
    def display(self):
        cur = self.head.next  # 跳过头结点
        while cur:
            print(cur.data, end=" ")
            cur = cur.next
        print()

    # 合并两个有序链表
    @staticmethod
    def merge(linked_list_a, linked_list_b):
        # 创建一个新链表
        merged_list = LinkedList()
        cur_a = linked_list_a.head.next  # 跳过头结点
        cur_b = linked_list_b.head.next  # 跳过头结点

        last_added = None  # 用于跟踪上一个添加的节点值,以避免重复

        while cur_a and cur_b:
            if cur_a.data < cur_b.data:  # A 的节点更小
                if last_added is None or cur_a.data != last_added:
                    merged_list.append(cur_a.data)
                    last_added = cur_a.data
                cur_a = cur_a.next
            elif cur_a.data > cur_b.data:  # B 的节点更小
                if last_added is None or cur_b.data != last_added:
                    merged_list.append(cur_b.data)
                    last_added = cur_b.data
                cur_b = cur_b.next
            else:  # cur_a.data == cur_b.data,两个节点相等
                if last_added is None or cur_a.data != last_added:
                    merged_list.append(cur_a.data)
                    last_added = cur_a.data
                cur_a = cur_a.next
                cur_b = cur_b.next

        # 添加剩余节点
        while cur_a:
            if last_added is None or cur_a.data != last_added:
                merged_list.append(cur_a.data)
                last_added = cur_a.data
            cur_a = cur_a.next

        while cur_b:
            if last_added is None or cur_b.data != last_added:
                merged_list.append(cur_b.data)
                last_added = cur_b.data
            cur_b = cur_b.next

        return merged_list

# 主程序
def main():
    # 创建第一个链表
    linked_list_a = LinkedList()
    input_a = input().split()
    for num in input_a:
        num = int(num)
        if num == 0:
            break
        linked_list_a.append(num)

    # 创建第二个链表
    linked_list_b = LinkedList()
    input_b = input().split()
    for num in input_b:
        num = int(num)
        if num == 0:
            break
        linked_list_b.append(num)

    # 合并两个链表
    merged_list = LinkedList.merge(linked_list_a, linked_list_b)

    # 输出合并后的链表
    merged_list.display()

# 调用主程序
main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莹雨潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值