7-3有序序列合并(15分)

该博客介绍如何使用C语言将两个升序排列的序列合并为一个有序序列。通过读取输入的序列长度和数值,然后整合并排序,最终输出合并后的有序序列。示例代码展示了具体的实现过程。

题目描述:

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

数据范围: 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000。

输入描述:

输入包含三行,

第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。

第二行包含n个整数,用空格分隔。

第三行包含m个整数,用空格分隔。

输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并

示例1

输入:

5 6
1 3 7 9 22
2 8 10 17 33 44

输出:

1 2 3 7 8 9 10 17 22 33 44

代码如下:

#include<stdio.h>
int main()
{
    int n,m,a[3000],i,j,t;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=n;i<=n+m-1;i++)  //将两组升序排列整合为一组 
        scanf("%d",&a[i]);
    for(i=0;i<n+m-1;i++)
        for(j=i+1;j<=n+m-1;j++) //将整合好的数组从小到大排列 
        {
            if(a[i]>a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
           }
        }
    for(i=0;i<=n+m-1;i++)
        printf("%d ",a[i]);  //输出排列好的数组 
    return 0;
}

以下是几种使用 Python 实现两个有序链表序列合并的代码和方法: ### 列表融合方法 ```python class Node: def __init__(self, value): self.value = value self.next = None class LinkedList: def __init__(self, root=None): self.root = root @classmethod def from_list(cls, values): dummy = Node(0) current = dummy for value in values: current.next = Node(value) current = current.next return cls(dummy.next) def __str__(self): result = [] current = self.root while current: result.append(str(current.value)) current = current.next return " ".join(result) def merge_linked_lists(list1, list2): # 创建一个哑节点作为合并后链表的头节点 cur = pre_root = Node(0) list1_node, list2_node = list1.root, list2.root # 迭代比较两个链表的节点值,将较小的节点连接到合并后的链表中 while list1_node is not None and list2_node is not None: if list1_node.value <= list2_node.value: cur.next = list1_node list1_node = list1_node.next else: cur.next = list2_node list2_node = list2_node.next cur = cur.next # 将剩余的节点连接到合并后的链表中 if list1_node is not None: cur.next = list1_node if list2_node is not None: cur.next = list2_node return LinkedList(root=pre_root.next) l1 = LinkedList.from_list([1, 2, 4]) l2 = LinkedList.from_list([1, 3, 4, 5]) l3 = merge_linked_lists(l1, l2) print(l3) ``` 此方法通过创建一个哑节点作为合并后链表的头节点,迭代比较两个链表的节点值,将较小的节点连接到合并后的链表中,最后将剩余的节点连接到合并后的链表末尾 [^2]。 ### 标准求解【直接合并】 ```python # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def mergeTwoLists(self, list1, list2): res = ListNode() ans = res while list1 != None and list2 != None: if list1.val <= list2.val: ans.next = list1 list1 = list1.next else: ans.next = list2 list2 = list2.next ans = ans.next if list1 == None: ans.next = list2 else: ans.next = list1 return res.next ``` 该方法同样是通过迭代比较两个链表节点值,将较小值的节点依次连接起来,最后处理剩余节点 [^4]。 ### 列表合并法(PTA 相关) ```python list1 = [int(x) for x in input().split() if x != &#39;-1&#39;] list2 = [int(s) for s in input().split() if s != &#39;-1&#39;] list_merged = list1 + list2 list_merged.sort() if len(list_merged) == 0: print(&#39;NULL&#39;) else: for i in list_merged[:-1]: print(i, end=&#39; &#39;) print(list_merged[-1]) ``` 此方法先将输入的两个有序链表数据别存储为列表,合并两个列表后进行排序,再按要求输出结果 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值