02-线性结构1 两个有序链表序列的合并

在这里插入图片描述在这里插入图片描述
分析:

  1. 题目要求写一个函数,将递增链表L1和L2合并为一个非递减函数
  2. 比较两链表的首结点,选其中最小值放入有序链表中,然后将剩下的值和最小值的下一个结点值比较
  3. 重复2,直到有一条链表的所有结点都已排序
  4. 将另外一条链表的剩余结点全部接上

思路:

  1. 创建一个结点,作为最终链表的头结点
  2. 再创建三个结点指针,分别指向已排序链表的尾结点,链表L1,L2的未排序部分的首结点
  3. 根据分析2,3,4写入代码

代码如下

List Merge( List L1, List L2 ) {
    List s = (List)malloc(sizeof(struct Node));     //把s作为最终返回链表的头结点 
    List r = s, r1 = L1->Next, r2 = L2->Next;       //r始终指向有序部分的尾结点,r1 r2 指向链表L1 L2中未排序的首结点
    while(r1 && r2) {   							//其中一个链表元素已全部排序 
        if(r1->Data <= r2->Data) {
            r->Next = r1; r = r1; r1 = r1->Next;
        }
        else {
            r->Next = r2; r = r2; r2 = r2->Next;
        } 
    }
    r->Next = r1? r1 : r2; 
    L1->Next = NULL; L2->Next = NULL;
    return s;
}

注意:

  1. 仔细看题,题目说了L1和L2都是带头结点的单链表,所以它们要排序的结点是从头结点的下一个结点开始
  2. 返回的也是最终链表的头结点…
  3. 输入输出样例表明,排序后L1和L2只剩一个头结点,所以最后应该把它们的下一个结点置为NULL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值