每日一道算法Day9

81 阅读1分钟

题目描述:

截屏2021-08-04 下午11.50.56.png

大致思路:

先创建一个空链表tmp, 然后while循环 l1、l2, 当l1、l2中任意一个为null时, 结束循环。

循环中比较 l1l2的值, 将空链表的 next指向值较小的那个, 最后 tmp 指向 tmpnext, 当然, 这样最后会有个问题, 拿到的tmp并不是完整的合并后的链表, 所以我们还得再最开始创建另一个空链表, 指向tmp, 最后空链表的 next即为完整的排完顺序的链表。

完整代码如下:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function mergeTwoLists(l1: ListNode | null, l2: ListNode | null): ListNode | null {
  //两个都为空, 直接返回null
  if (!l1 && !l2) return null;
  let tmp = new ListNode();
  let res = tmp;
  while (l1 && l2) {
    if (l1.val < l2.val) {
      tmp.next = l1;
      l1 = l1.next;
    } else {
      tmp.next = l2;
      l2 = l2.next;
    }
    tmp = tmp.next;
  }
  //有一个为空
  if (!l1) {
    //l1 为空, 直接将l2拼在 tmp上
    tmp.next = l2;
  } else {
    //l2 为空, 直接将l1拼在 tmp上
    tmp.next = l1;
  }
  return res.next;
}

最后贴上 🧍‍♂️ 递归思路:

  if(!l1) return l2;
  if(!l2) return l1;
  if (l1!.val < l2!.val) {
     l1!.next = mergeTwoLists(l1?.next ?? null, l2);
     return l1;
   }
   l2!.next = mergeTwoLists(l1, l2!.next ?? null);
   return l2;