《剑指offer》第11期:两个链表题目

时间:2022-06-21
本文章向大家介绍《剑指offer》第11期:两个链表题目,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个结点。

思路

简单思路: 循环到链表末尾找到 length 在找到length-k节点 需要循环两次。

优化:设定两个节点,间距相差k个节点,当前面的节点到达终点,取后面的节点。

前面的节点到达k后,后面的节点才出发。

本题目着重考察代码鲁棒性、容错率: 需要考虑head为null,k为0,k大于链表长度的情况

代码

function FindKthToTail(head, k) {
      if (!head || !k) return null;
      let front = head;
      let behind = head;
      let index = 1;
      while (front.next) {
        index++;
        front = front.next;
        if (index > k) {
          behind = behind.next;
        }
      }
      return (k <= index) && behind;
    }

合并两个有序链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路

链表头部节点比较,取较小节点。

小节点的next等于小节点的next和大节点的较小值。

如此递归。

返回小节点。

考虑代码的鲁棒性,也是递归的终止条件,两个head为null的情况,取对方节点返回。

代码

function Merge(pHead1, pHead2) {
      if (!pHead1) {
        return pHead2;
      }
      if (!pHead2) {
        return pHead1;
      }
      let head;
      if (pHead1.val < pHead2.val) {
        head = pHead1;
        head.next = Merge(pHead1.next, pHead2);
      } else {
        head = pHead2;
        head.next = Merge(pHead1, pHead2.next);
      }
      return head;
    }