给你一个链表,删除链表的倒数第 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的位置找错了