LeetCode-82. 删除排序链表中的重复元素 II

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/love905661433/article/details/84842471

题目

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

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

示例 2:

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

解题

  • 设置虚拟头节点
  • 设置一个标识记录当前节点是否是待删除节
  • 如果下一个节点和当前节点相等, 就将下一个节点删除, 同时将当前节点标记为待删除
  • 如果下一个节点和当前节点不相等, 就查看一下当前节点是否需要删除, 然后游标后移即可, 代码如下 :
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode pre = dummyHead;
        ListNode cur = dummyHead.next;
        // 标识当前节点是否需要删除
        boolean curIsDelete = false;
        while (cur != null && cur.next != null){
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
                // 出现重复节点, 将当前cur标记为需要删除
                curIsDelete = true;
            } else {
                if (curIsDelete) {
                    pre.next = cur.next;
                    cur = pre.next;
                    // 新的cur节点,所以需要重置curIsDelete
                    curIsDelete = false;
                } else {
                    pre = cur;
                    cur = cur.next;
                }
            }
        }

        if (curIsDelete) {
            pre.next = cur.next;
            cur = pre.next;
            // 新的cur节点,所以需要重置curIsDelete
            curIsDelete = false;
        }

        return dummyHead.next;
    }
}

LeetCode上的提交记录里面看到更简洁的解法, 使用递归的算法,代码也贴在下面 :

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode root = new ListNode(Integer.MAX_VALUE);
        root.next = getNextNode(head, root.val);
        return root.next;
    }
    
    public ListNode getNextNode(ListNode head, int last){
        if(head == null) return null;
        if(head.val == last) return getNextNode(head.next, last);
        if(head.next != null && head.next.val == head.val) return getNextNode(head.next, head.val);
        head.next = getNextNode(head.next, head.val);
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/love905661433/article/details/84842471
今日推荐