剑指Offer系列:删除链表中重复的结点

该文章介绍了一种解题思路,即使用辅助栈在O(n)的时间和空间复杂度下删除排序链表中的重复节点。通过遍历链表,当栈为空时将节点压入,否则比较栈顶元素与当前节点的值,若不等则更新栈顶元素的指向并压入当前节点,若相等则跳过重复节点直至找到不同的节点。

2022/12/31 23:15:41 by: 程序员·小李

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5

数据范围:链表长度满足 0≤n≤1000 ,链表中的值满足 1≤val≤1000

进阶:空间复杂度 O(n) ,时间复杂度 O(n)

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

解题思路

使用辅助栈完成去重,当栈为空直接压栈,栈中存在元素时,通过peek方法判断是否重复,如果出现重复则直接找到下一个不重复的元素,同时修改上一个引用的指向。

代码实现

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        ListNode res = null;

        java.util.Stack<ListNode> stack = new java.util.Stack<ListNode>();
        while (pHead != null){
            if (stack.isEmpty()){
                // 当前为空直接追加
                stack.push(pHead);
                pHead = pHead.next;
            } else if (stack.peek().val != pHead.val){
                // 存在元素,指向更新,并追加
                stack.peek().next = pHead;
                stack.push(pHead);
                pHead = pHead.next;
            } else {
                // 重复的元素
                int val = stack.pop().val;
                while (pHead != null && val == pHead.val){
                    pHead = pHead.next;
                }

                if (!stack.isEmpty()){
                    // 清空指向
                    stack.peek().next = null;
                }
            }
        }

        while (!stack.isEmpty()){
            res = stack.pop();
        }

        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值