zoukankan      html  css  js  c++  java
  • LeetCode(21):合并两个有序链表

    Easy!

    题目描述:

    将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

    示例:

    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4

    解题思路:

    具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接将另一个未完成的链表直接链入新链表的末尾。代码如下:

    C++解法一:

     1 class Solution {
     2 public:
     3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
     4         ListNode *dummy = new ListNode(-1), *cur = dummy;
     5         while (l1 && l2) {
     6             if (l1->val < l2->val) {
     7                 cur->next = l1;
     8                 l1 = l1->next;
     9             } else {
    10                 cur->next = l2;
    11                 l2 = l2->next;
    12             }
    13             cur = cur->next;
    14         }
    15         cur->next = l1 ? l1 : l2;
    16         return dummy->next;
    17     }
    18 };

    下面我们来看递归的写法,当某个链表为空了,就返回另一个。然后核心还是比较当前两个节点值大小,如果l1的小,那么对于l1的下一个节点和l2调用递归函数,将返回值赋值给l1.next,然后返回l1;否则就对于l2的下一个节点和l1调用递归函数,将返回值赋值给l2.next,然后返回l2,参见代码如下:

    C++解法二:

     1 class Solution {
     2 public:
     3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
     4         if (!l1) return l2;
     5         if (!l2) return l1;
     6         if (l1->val < l2->val) {
     7             l1->next = mergeTwoLists(l1->next, l2);
     8             return l1;
     9         } else {
    10             l2->next = mergeTwoLists(l1, l2->next);
    11             return l2;
    12         }
    13     }
    14 };

    下面这种递归的写法去掉了if从句,看起来更加简洁一些,但是思路并没有什么不同:

    C++解法三:

     1 class Solution {
     2 public:
     3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
     4         if (!l1) return l2;
     5         if (!l2) return l1;
     6         ListNode *head = l1->val < l2->val ? l1 : l2;
     7         ListNode *nonhead = l1->val < l2->val ? l2 : l1;
     8         head->next = mergeTwoLists(head->next, nonhead);
     9         return head;
    10     }
    11 };

    还可以三行搞定,简直丧心病狂有木有!

    C++解法四:

    1 class Solution {
    2 public:
    3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    4         if (!l1 || (l2 && l1->val > l2->val)) swap(l1, l2);
    5         if (l1) l1->next = mergeTwoLists(l1->next, l2);
    6         return l1;
    7     }
    8 };
  • 相关阅读:
    JS中原型对象中的constructor的作用?
    ES Module,commonjs和Typescript模块系统
    webpack中的hash、chunkhash和contenthash
    react-spring介绍(翻译)
    Typescript中的对象多可能类型推导的解决办法
    博客定制样式和脚本代码
    React和Vue对比
    CSS动画属性/重绘重排组合层/GPU加速 渲染优化相关及联系
    Object.create()探索
    await的错误处理问题,一个issue引发的ts社区的讨论
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9133521.html
Copyright © 2011-2022 走看看