链表的面试题4之合并有序链表

这篇文章我们继续来讲链表中很经典的面试题:合并有序链表。

目录

迭代

递归


我们首先来看一下这张图片里面的要求,给你两个链表,要求把他们按照从小到大的方式排列。

这里涉及到几个问题,首先,我们的头节点是不是要释放一个?而且我们把该节点连接到另外一个链表的某个节点上的时候?会不会存在指针丢失的问题?就算你链接的很稳妥,那么这里又会涉及到时间复杂度和空间复杂度的问题。

好了,不多说了,再说就要被自己绕晕了哈哈,初学者就是不需要想很多,遇到链表的题,无非三种路径,双指针,迭代,递归。

我们先来看好理解的迭代的方法。当然这道题的双指针和迭代其实也是殊途同归。本质上是一样的。

迭代

我们可以用迭代的方法来实现上述算法。当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。

所以这其实是一种暴力求法,也就是说,我一个个拿出来比较,因为我的原链表是有序的,所以不存在重复比较的过程。所以我就大胆给两个链表各一个变量去遍历然后比较。

当然,这里为什么要自定义一个哨兵位头节点?因为有了头节点能够更好更容易返回我们合并后的链表。这里把代码给大家放一下,稍微填了一些注释。

cs 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        
        auto dummy = new ListNode(0);
        auto cur = dummy;
        while( list1 && list2 ){
            auto pp = (list1->val < list2->val) ? &list1 : &list2;  // 获取俩链表当前值小的结点
            cur->next = *pp;    // cur 指向值小的结点
            cur = cur->next;    // cur 后移
            *pp = (*pp)->next;  // *pp 也要后移,不然下次循环比较的还是旧的list1或list2结点
        }
        // 循环结束,list1 和 list2 其中有一个为空,但不知道是哪个
        cur->next = (list1) ? list1 : list2;

        return dummy->next;
    }
};

递归

我们再来看递归。递归其实难的不是想不想的到,难的是对自我返回条件的判定。简单的说,难的是这个递归该做到哪一步。怎么回归。当然,如果你做的多了,很快很自然就能想到我为什么需要去限制比较的条件呢,或者说我回归的应该是节点,我的条件的判断才应该是比较。

所以代码如下:

cs 复制代码
public class Solution {
    public ListNode MergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = MergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = MergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}

好了,这道题就讲到这里

如果你觉得对你有帮助,可以点赞关注加收藏,感谢您的阅读,我们下一篇文章再见。

一步步来,总会学会的,首先要懂思路,才能有东西写。

相关推荐
晚安日记wanna23 分钟前
SSR 为什么不适合登录态从水合冲突到缓存串号
前端·react.js·面试
晚安日记wanna26 分钟前
压测 TPS 卡在 800CPU 只跑四成六步定位法
运维·面试·测试
晚安日记wanna34 分钟前
批量请求失败只弹一个 Toast面试官想听五层
前端·面试·架构
晚安日记wanna41 分钟前
TS const 类型参数一道面试题的四层追问
前端·面试·typescript
晚安日记wanna42 分钟前
大表 DDL 面试翻车现场Online DDL 为什么还会锁死业务
数据库·面试·架构
晚安日记wanna44 分钟前
MySQL 主从延迟别只答并行复制
数据库·面试·架构
SamDeepThinking1 小时前
Java 17内存屏障:为什么需要,怎么用
java·后端·面试
青山木1 小时前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划
CC数分1 小时前
2026年金融数据分析岗位需要哪些工具?2027届秋招备考指南
面试·数据分析
土司大王1 小时前
LeetCode hot100——33.搜索旋转排序数组:Java 二分模板与 O(log n) 实现
数据结构·算法·leetcode