博客
关于我
Leetcode 21. Merge Two Sorted Lists
阅读量:797 次
发布时间:2023-01-30

本文共 1655 字,大约阅读时间需要 5 分钟。

Merge Two Sorted Lists

当我们需要将两个有序的列表合并成一个有序的新列表时,常用的方法包括递归和迭代。以下将详细介绍这两种方法,并提供相应的代码实现。


递归方法

递归是一种常见的解决方案,其思路是将问题分解,将较大的问题转化为较小的问题进行处理。对于合并两个有序列表,递归的方法可以简单地描述为:

  • 比较当前节点的值:比较两个列表当前的头节点,决定归属哪一个到结果列表中。
  • 递归处理剩余节点:将当前归属的节点的下一个节点继续传递给递归函数,处理剩余部分。
  • 返回结果:递归返回第一个处理后的结果,将其作为当前的结果节点。
  • 这种方法的优点是简洁直观,但它可能不够高效,尤其是在处理大规模数据时会引起递归深度过深的问题。

    示例代码如下:

    // 定义单结点结构struct ListNode {    int val;    ListNode* next;    ListNode(int x) : val(x), next(nullptr) {}};class Solution {public:    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {        if (!l1) return l2;        if (!l2) return l1;        if (l1->val < l2->val) {            l1->next = mergeTwoLists(l1->next, l2);            return l1;        } else {            l2->next = mergeTwoLists(l1, l2->next);            return l2;        }    }};

    迭代方法

    迭代方法则通过循环遍历来逐步构建结果列表。这种方法的主要步骤如下:

  • 创建结果列表:初始化一个头节点和一个尾节点,提供一个游标来逐步添加节点。
  • 比较节点值:在每次循环中,比较两个列表当前的头节点的值,决定将当前节点添加到结果列表的尾部。
  • 移动指针:将不再处理的列表的指针向前移动一位。
  • 处理剩余节点:当其中一个列表处理完毕后,将其剩余节点逐一添加到结果列表中。
  • 返回结果:返回结果列表的头节点开始部。
  • 这种方法的优点是空间复杂度低,时间复杂度是O(n + m),其中n和m分别是两个列表的节点数。

    示例代码如下:

    class Solution {public:    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {        ListNode* head = new ListNode(-1);        ListNode* end = head;        while (l1 && l2) {            if (l1->val < l2->val) {                end->next = l1;                l1 = l1->next;            } else {                end->next = l2;                l2 = l2->next;            }            end = end->next;        }        if (l1) {            end->next = l1;        } else {            end->next = l2;        }        return head->next;    }};

    总结

    上述两种方法各有优劣。递归方法实现简单易懂,但不适合大规模数据;迭代方法空间占用更少,更适合处理大量数据。但在实际应用中,可以根据具体需求选择相应的实现方法。

    转载地址:http://iagyk.baihongyu.com/

    你可能感兴趣的文章
    leetcode238-除自身以外数组的乘积
    查看>>
    LeetCode240:Search a 2D Matrix II
    查看>>
    LeetCode268.缺失数字
    查看>>
    LeetCode331.验证二叉树的前序序列化
    查看>>
    leetcode380. Insert Delete GetRandom O(1)
    查看>>
    LeetCode502
    查看>>
    leetcode507
    查看>>
    LeetCode7.整数反转 JavaScript
    查看>>
    Leetcode: Group Anagrams
    查看>>
    Leetcode: Remove Duplicates from Sorted Array II
    查看>>
    Leetcode: Spiral Matrix II
    查看>>
    LeetCode: String to Integer (atoi)
    查看>>
    Leetcode:454. 4Sum II
    查看>>
    leetcode:Minimum Depth of Binary Tree【Python版】
    查看>>
    LeetCode:Restore IP Addresses
    查看>>
    LeetCode:Subsets I II
    查看>>
    LeetCode_Lowest Common Ancestor of a Binary Search Tree (Binary Tree)
    查看>>
    LeetCode——Unique Paths
    查看>>
    LeetCode二叉树从上至下路径问题总结(112.113.437.129)
    查看>>
    leetcode出现cannot find symbol [in __Driver__.java]
    查看>>