zoukankan      html  css  js  c++  java
  • 删除排序链表中的重复节点

    第一种是保留一个重复节点

    https://leetcode.com/problems/remove-duplicates-from-sorted-list/

    这种好理解,碰到重复的就把指针指向重复节点的下一个。

    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        
        ListNode tmp = head;
        while(tmp.next != null){
            if(tmp.val == tmp.next.val){
                tmp.next = tmp.next.next;
            }else {
                tmp = tmp.next;
            }
        }
        
        return head;
    }

    第二种删除所有重复的

    https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/

    这种由于传入链表的头结点存在被删除的可能,所以先定义了一个新的头结点。

    定义两个指针,后一个(last)不断指向重复的节点,当遇到不重复节点的时候,也就是 $last != last.next$,需要把前一个(pre)指针的下一个指向后一个指针的下一个(因为要删除所有重复的节点,此时 last 指向当前重复的最后一个节点,所以要让 $pre.next = last.next$)

    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        
        ListNode fakeH = new ListNode(-1);
        fakeH.next = head;
        ListNode pre = fakeH;
        ListNode last = fakeH.next;
        
        while(last != null){
            if(last.next != null && last.val == last.next.val){
                while(last.next != null && last.val == last.next.val){
                    last = last.next;
                }
                pre.next = last.next;
                last = last.next;
            }else{
                pre = pre.next;
                last = last.next;
            }
        }
        
        return fakeH.next;
    }
    

      

  • 相关阅读:
    LOL 计蒜客
    cf1486 D. Max Median
    P3567 [POI2014]KUR-Couriers
    dp 求物品组合情况
    黑暗爆炸
    hdu5306 Gorgeous Sequence
    P4609 [FJOI2016]建筑师
    cf 1342 E. Placing Rooks
    重修dp-背包
    acwing 2154. 梦幻布丁
  • 原文地址:https://www.cnblogs.com/ainsliaea/p/11484655.html
Copyright © 2011-2022 走看看