zoukankan      html  css  js  c++  java
  • 21.合并两个有序链表

    2020-04-28
    合并两个有序链表

    将两个升序链表合并为一个新的升序链表并返回。

    新链表是通过拼接给定的两个链表的所有节点组成的。

    题解:
    思路1:递归

    如果 l1 或者 l2 一开始就是 null ,那么没有任何操作需要合并,所以我们只需要返回非空链表。

    否则,我们要判断 l1 和 l2 哪一个的头元素更小,然后递归地决定下一个添加到结果里的值。

    如果两个链表都是空的,那么过程终止,所以递归过程最终一定会终止。

    var mergeTwoLists = function (l1, l2) {
      if (l1 === null) return l2; // 如果L1不存在了 直接返回L2
      else if (l2 === null) return l1; // L2不存在返回L2
      else if (l1.val < l2.val) { // 如果L1节点的值比L2节点小 那么当前节点取L1的值 next取 递归后的值
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
      }
      else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
      }
    };
    思路2:迭代

    首先,我们设定一个哨兵节点 "prehead" ,这可以在最后让我们比较容易地返回合并后的链表。

    我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,

    直到 l1 或者 l2 指向了 null :如果 l1 当前位置的值小于等于 l2 ,

    我们就把 l1 的值接在 prev 节点的后面同时将 l1 指针往后移一个。否则,我们对 l2 做同样的操作。

    不管我们将哪一个元素接在了后面,我们都把 prev 向后移一个元素。

    在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,

    所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。

    这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表。

    var mergeTwoLists = function (l1, l2) {
      let prehead = new ListNode(Number.MIN_SAFE_INTEGER); // 设置一个最小的节点
      let prev = prehead; 
      while (l1 && l2) { // 如果l1,l2都存在 那么迭代
        if (l1.val < l2.val) { // 取小的那个节点作为prev的next 依次迭代直到l1或l2某个为null
          prev.next = l1;
          l1 = l1.next;
        } else {
          prev.next = l2;
          l2 = l2.next;
        }
        prev = prev.next;
      }
      prev.next = l1 ? l1 : l2; // 当某个为null时 prev的next就是剩下有值的节点了
      return prehead.next; // 返回最小节点的next 也就是合并后的第一个节点
    }
  • 相关阅读:
    软工第1次阅读作业
    软工第0次作业
    第四次博客
    第三次博客
    第二次
    第一次博客
    提问回顾与个人总结
    软件工程结对作业
    软件工程第一次阅读作业
    软件工程第0次个人作业
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12792028.html
Copyright © 2011-2022 走看看