链表篇(二)删除排序链表中的重复元素


给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。


示例 1:


输入: 1->1->2
输出: 1->2
示例 2:


输入: 1->1->2->3->3
输出: 1->2->3


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。




public
class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; } }

解题思路:

1、首先要知道,链表是如何实现删除元素--当前结点的next指针指向结点A,让其不指向A结点,指向其他结点,就实现了A结点的删除。

2、当前结点和后一结点做比较,如果两者值相等,当前结点的next指针不指向与其值相等的下一结点,而是指向下一结点的next

  如果不相等,进行下一个结点和其next指针所指向结点的比较。

3、利用链表的原理和递归的思想

代码1、

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode guardNode = new ListNode(0);
        ListNode newLinkedList = guardNode;
        if(head != null) {
            newLinkedList.next = head;
            int val = head.val;
            if (head.next != null) {
                if (head.val == head.next.val) {
                    //当前节点的next指针指向后一结点的next指针
                    head.next = head.next.next;
                    deleteDuplicates(head);
                } else {
                    head = head.next;
                }
            }
        }

        return guardNode.next;
    }
}

代码2、和代码1的核心思想是一样的,只是优雅了一下代码。执行用时均为1ms,但是内存消耗少了0.2M

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
       if (head == null) {
            return null;
        }
        if (head.next == null) {
            return head;
        }
        if (head.val == head.next.val) {
            head.next = head.next.next;
            deleteDuplicates(head);
        } else {
            deleteDuplicates(head.next);
        }
        return head;
    }
}
原文地址:https://www.cnblogs.com/coisini/p/12019579.html