leetcode-链表-合并两个有序链表和删除链表的倒数第 N 个结点

122 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

今天讲解的是链表系列的2道题:

1.合并两个有序链表

2.删除链表的倒数第 N 个结点

21. 合并两个有序链表

leetcode地址:leetcode.cn/problems/re…

难度

简单

描述

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

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:

输入:l1 = [], l2 = [] 输出:[] 示例 3:

输入:l1 = [], l2 = [0] 输出:[0]  

提示:

两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列

解法

1.因为两个链表都是升序的,可以采用递归

2.首先判断list1不存在,直接返回list2

3.判断list2不存在,直接返回list1

4.当list1.val 小于等于 list2.val的话,采用递归,那list1的下一个节点的值,就是list1.next和list2中较小的其中一个,最后返回list1

5.否则放lis1.val大于list2.val,采用递归,那list2的下一个节点的值,就是list1和list2.next中较小的其中一个,最后返回list2

代码

/*
 * @lc app=leetcode.cn id=21 lang=javascript
 *
 * [21] 合并两个有序链表
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    if(list1 === null) return list2;
    if(list2 === null) return list1;

    if(list1.val <= list2.val){
        list1.next = mergeTwoLists(list1.next, list2)
        return list1;
    }else{
        list2.next = mergeTwoLists(list1, list2.next)
        return list2;
    }
};
// @lc code=end

19. 删除链表的倒数第 N 个结点

leetcode地址leetcode.cn/problems/re…

难度

中等

描述

给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:

输入:head = [1], n = 1 输出:[] 示例 3:

输入:head = [1,2], n = 1 输出:[1]  

提示:

链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz

解法

1.双指针遍历:首先定义slow、fast双指针并初始化为head,然后fast后移n步

2.接着双指针一起往后移动,直到fast.next === null,此时slow.next就是要删除的结点

3.注意特例判断:如果n和链表中总结点个数相同,即要删除的是链表头结点,此时直接返回head.next即可

代码

/*
 * @lc app=leetcode.cn id=19 lang=javascript
 *
 * [19] 删除链表的倒数第 N 个结点
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    let dummyHead = new ListNode(0)
    dummyHead.next = head;

    let p = dummyHead;
    let q = dummyHead;
    for(let i = 0;i<n+1;i++){
        q = q.next;
    }

    // 移动p,q
    while(q){
        p = p.next;
        q= q.next;
    }

    // 删除节点
    let delNode = p.next;
    p.next = delNode.next;

    return dummyHead.next;


};
// @lc code=end