力扣算法ing(30 / 100)

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

给你一个链表,删除链表的倒数第 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]

删除指定的节点,给出头节点

逆转链表,寻找第n个,删除

不行不行,逆转录又要反转回去

后面我想到了一个解决办法:

利用数组计算总长度,然后再删除

我的代码:

function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
    let arr = [];
    let cur = head;
    let pre = head;
    while(cur != null){
        arr.push(cur.val);
        cur = cur.next;
    }
    let len = arr.length;
    // 当删除的n和len相同,删除头节点
    if(n === len) return head.next;
    for(let i = 0 ; i < len - n - 1 ; i++){
        pre = pre.next;
    }
    // 删除逻辑
    cur = pre.next;
    let next = cur.next;
    pre.next = next;
    cur.next = null;
    return head;
    
};

遇到的问题1:再循环记录数到数组当中的时候没有改变cue,导致执行错误

遇到的问题2:没有考虑到删除的n和len相同,删除头节点

ull && l2 !== null)


我的代码:

解答错误
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
// 双指针
let l1 = list1;
let l2 = list2;
const newList = new ListNode;
let cur = newList;
while(l1!== null && l2 !== null){
if(l1.val === l2.val){
cur.next = l1;
l1 = l1.next;
}else if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}else if(l1.val > l2.val){
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
return newList;
};
莫名多出来了一个0,返回不应该只返回newList


我的代码:

function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
// 双指针
let l1 = list1;
let l2 = list2;
const newList = new ListNode;
let cur = newList;
while(l1!== null && l2 !== null){
if(l1.val === l2.val){
cur.next = l1;
l1 = l1.next;
}else if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}else if(l1.val > l2.val){
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
return newList.next;
};
解答错误,只考虑了l1和l2是相同的长度,应该还要考虑剩余下来的


正确代码:

function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
// 双指针
let l1 = list1;
let l2 = list2;
const newList = new ListNode;
let cur = newList;
while(l1!== null && l2 !== null){
if(l1.val === l2.val){
cur.next = l1;
l1 = l1.next;
}else if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}else if(l1.val > l2.val){
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
if(l1 != null){
cur.next = l1;
}else if(l2 != null){
cur.next = l2
}
return newList.next;
};


# 3.17 19.删除链表的倒数第n个结点

给你一个链表,删除链表的倒数第 `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]


删除指定的节点,给出头节点

逆转链表,寻找第n个,删除

不行不行,逆转录又要反转回去

后面我想到了一个解决办法:

利用数组计算总长度,然后再删除

我的代码:

function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
let arr = [];
let cur = head;
let pre = head;
while(cur != null){
arr.push(cur.val);
cur = cur.next;
}
let len = arr.length;
// 当删除的n和len相同,删除头节点
if(n === len) return head.next;
for(let i = 0 ; i < len - n - 1 ; i++){
pre = pre.next;
}
// 删除逻辑
cur = pre.next;
let next = cur.next;
pre.next = next;
cur.next = null;
return head;

};


遇到的问题1:再循环记录数到数组当中的时候没有改变cue,导致执行错误

遇到的问题2:没有考虑到删除的n和len相同,删除头节点

遇到的问题3:pre的位置找错了

你可能感兴趣的:(小白学习算法,算法,leetcode,typescript,javascript)