每日一道算法题 1Day

152 阅读2分钟

03ad-0e7aca4fd34c4911abbee4069a1d3904.jpg

前言


算法一直是自己的弱项,希望通过更新文章来补充自己的弱项,也欢迎各位大佬提出宝贵的意见,小弟在此不胜感激!

合并两个有序链表

题目表述

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

思路

我们可以用递归法来解决这个问题,将两个链表头部较小的一个与剩下的元素合并,并返回排好序的链表头,当两条链表中的一条为空时终止递归。当然,我们还可以用迭代法进行比较,通过比较两个链表的节点值,每次选择较小的节点,并将其添加到新链表中,然后将相应链表的指针向后移动一位。重复这个过程,直到其中一个链表的指针走到末尾,然后将另一个链表的剩余部分直接添加到新链表的末尾。

代码实现

1. 迭代法
function mergeTwoLists(l1, l2) {
  let dummyHead = new ListNode(-1);
  let current = dummyHead;

  while (l1 && l2) {
    if (l1.val <= l2.val) {
      current.next = l1;
      l1 = l1.next;
    } else {
      current.next = l2;
      l2 = l2.next;
    }
    current = current.next;
  }

  current.next = l1 || l2;

  return dummyHead.next;
}
2. 迭代法
function mergeTwoLists(l1, 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;
  }
}

注意事项

  1. 要确保输入的两个链表都是升序的。如果输入的链表不是升序的,则在合并前需要先进行排序。
  2. 要处理链表节点的指针操作时,确保在链表为空时能正确地返回另一个链表。
  3. 在处理链表节点的指针操作时,确保不会出现空指针异常,特别是在迭代法中需要仔细处理节点指针的变化。
  4. 考虑到链表可能有大量节点,合并链表的操作最好是通过修改节点的指针来实现,避免不必要的节点复制。

总结

这个算法运用到的知识分为:

  1. 单链表的数据结构:链表是由节点组成的数据结构,每个节点都包含一个值和指向下一个值的指针。
  2. 迭代:通过循环遍历链表节点,完成合并过程。
  3. 指针操作:在迭代中,需要处理链表节点的指针,进行节点间的连接和移动。

当然这里的回答还有代码不全是我自己想出来的,也是借鉴了其他人的一些回答来进行总结完善的,也希望自己有一天能独立完成解答过程,最后还是那句话,革命还未结束,小伙还需继续努力。