多个单链表的合成

建立两个非递减有序单链表,然后合并成一个非递增有序的单链表。

注意:建立非递减有序的单链表,需要采用创建单链表的算法

输入格式:

1 9 5 7 3 0

2 8 4 6 0

输出格式:

9 8 7 6 5 4 3 2 1

输入样例:

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

2 8 4 6 3 7 0
-4 5 6 2 3 9 0

输出样例:

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

9 8 7 6 6 5 4 3 3 2 2 -4

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

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

    # 有序插入节点到非递减链表中
    def insert(self, data):
        new_node = Node(data)
        cur = self.head
        # 找到插入位置: cur.next 为第一个大于 data 的节点
        while cur.next and cur.next.data < data:
            cur = cur.next
        new_node.next = cur.next
        cur.next = new_node

    # 合并两个非递减链表,并返回合并后的链表
    def merge(self, other):
        merged_list = LinkedList()  # 创建新的合并链表
        cur1 = self.head.next  # 跳过头结点
        cur2 = other.head.next  # 跳过头结点

        # 合并两个链表
        while cur1 and cur2:
            if cur1.data <= cur2.data:
                merged_list.insert(cur1.data)
                cur1 = cur1.next
            else:
                merged_list.insert(cur2.data)
                cur2 = cur2.next

        # 处理剩余的元素
        while cur1:
            merged_list.insert(cur1.data)
            cur1 = cur1.next
        while cur2:
            merged_list.insert(cur2.data)
            cur2 = cur2.next

        return merged_list

    # 反转链表
    def reverse(self):
        prev = None
        cur = self.head.next  # 跳过头结点
        while cur:
            next_node = cur.next  # 保存下一个节点
            cur.next = prev  # 反转指针
            prev = cur  # 移动 prev
            cur = next_node  # 移动 cur
        self.head.next = prev  # 更新头结点的next指针

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

# 主程序
def main():
    # 建立第一个链表
    linked_list1 = LinkedList()
    input1 = input().split()
    for num in input1:
        num = int(num)
        if num == 0:
            break
        linked_list1.insert(num)

    # 建立第二个链表
    linked_list2 = LinkedList()
    input2 = input().split()
    for num in input2:
        num = int(num)
        if num == 0:
            break
        linked_list2.insert(num)

    # 合并两个有序链表
    merged_list = linked_list1.merge(linked_list2)

    # 反转合并后的链表以变为非递增顺序
    merged_list.reverse()

    # 打印反转后的链表
    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、付费专栏及课程。

余额充值