Leetcode每日一题 —— 2095. 删除链表的中间节点

魔法师 2026-06-15 09:08 1



思路


今天的题用快慢指针只遍历一遍即可,所以就用快慢指针吧。


代码


    public ListNode deleteMiddle(ListNode head) {
ListNode hair = new ListNode(0, head);
ListNode prev = hair;
ListNode fast = head;
ListNode slow = head;
// 快指针走两步慢指针走一步,快指针 next是null或者next.next是null 时 slow正好处于 n/2 的位置,所以要加一个前置节点来连接删除后断开的两节点
while (fast != null && fast.next != null) {
fast = fast.next.next;
prev = slow;
slow = slow.next;
}
prev.next = slow.next;
return hair.next;
}

(0614) 2130. 链表最大孪生和


思路


补下昨天的题,昨天的题看题意应该也是用快慢指针,但是题目没有要求不能使用额外空间,所以用数组感觉效率更高。唯一就是初始化int[100001]开销可能有点大,不过因为不需要重置为0,所以可以放到static中初始化一次就够了。


代码


 class Solution {
public int pairSum(ListNode head) {
int[] list = new int[100001];
int n = 0;
while (head != null) {
list[n++] = head.val;
head = head.next;
}
int ans = 0;
for (int i = 0; i < n / 2; i++) {
ans = Math.max(ans, list[i] + list[n - 1 - i]);
}
return ans;
}
}
最新回复 (2)
  • SomeBottle 06-15 09:51
    1

    今天和昨天一样能用到快慢指针,可以用 fast->next 是否为 nullptr 作为一趟扫描的结束点,这个时候慢指针正好指向要移除的节点。


    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * ListNode *next;
    * ListNode() : val(0), next(nullptr) {}
    * ListNode(int x) : val(x), next(nullptr) {}
    * ListNode(int x, ListNode *next) : val(x), next(next) {}
    * };
    */
    class Solution {
    public:
    ListNode* deleteMiddle(ListNode* head) {
    // 依旧快慢指针
    // 链表分偶数长度和奇数长度情况
    ListNode *fast=head,*slow=head;
    ListNode *prev=nullptr; // 存 slow 上一个节点
    while(fast->next!=nullptr){
    prev=slow;
    slow=slow->next;
    fast=fast->next;
    if(fast->next!=nullptr){
    fast=fast->next;
    }
    }
    // 此时 slow 指向要移除的节点
    if(prev==nullptr){
    // 只有一个节点的情况
    return slow->next;
    }
    prev->next=slow->next;
    return head;
    }
    };
  • 亓水 06-15 09:52
    2

    羡慕佬们还有精力,我也不知道从什么时候开始,每天都在VibeCoding,好久没碰代码了,算法比赛也落下了 ^-^

* 帖子来源Linux.do
返回