合并两个递增有序单链表为递减有序单链表

有两个不带头结点的单链表,且数据元素为整数型,且递增有序。 (此时假设它输入的时候就已经是递增有序的单链表了)

算法实现目标:将这两个单链表合并为一个递减有序的单链表

思路:可以利用这两个链表本来就是递增有序的特性进行合并,然后再进行逆序,即可得到递减有序链表。

链表类:


//链表类
class List {
   
public:
    int val;
    List* next;
public:
    List() : val(0), next(nullptr) {
   }
    List(int x) : val(x), next(nullptr) {
   }
    List(int x, List* next) : val(x), next(next) {
   }
};

合并链表函数
使用了3个指针:now,p1,p2
1.先比较两个链表头结点的数值的大小,选择更小者作为新链表的头结点。

2.此后设置now指向新链表的当前结点,而p1指向链表1未加入新链表的结点,p2指向链表2未加入新链表的结点。

3.p1和p2进行数值比较,选择结点值更小的加入新链表,而p1/p2要指向p1->next/p2->next(即往前移)

4.以此类推,最后有3种情况,即链表1和链表2都全并入新链表或 链表1加入新链表 或 链表2加入新链表。只需要判断p1和p2哪个为空,在now后面接上剩余链表即可(因为已经有序了)

个人觉得该思路的好处是一次遍历即可合并,并且不用额外空间

//该函数作用:合并递增链表为一个新的递增链表
int MergeList1(List* l1, List* l2) {
   
    //先判断l1、l2是否为空节点
    if (l1 == nullptr && l2 == nullptr)
        return 0;
    if (l1 == nullptr) return 2;
    if (l2 == nullptr) return 1;

    List *head,*now<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值