83. Remove Duplicates from Sorted List

题目

原始地址:https://leetcode.com/problems/remove-duplicates-from-sorted-list/#/description

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        
    }
}

描述

给定一个已经排序的单链表,删除所有重复的节点,保证每个元素只出现一次。

分析

解题思路很容易想到,无非逐个节点遍历,判断下一个节点的值是否与当前节点相同,如果相同就删除下一个节点,直到结束,见解法1。
当然递归也是能解决的,不过需要转换一下思维,去除重复值并没有要求保留每组重复值中的第一个,因此在递归时如果发现相邻节点值相同,那么我们直接返回后面的节点,相当于删除了前面的节点。递归解法见解法2.

解法1

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return head;
        }
        ListNode curr = head;
        while (curr.next != null) {
            if (curr.next.val == curr.val) {
                curr.next = curr.next.next;
            } else {
                curr = curr.next;
            }
        }
        return head;
    }
}

解法2

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        head.next = deleteDuplicates(head.next);
        return head.val == head.next.val ? head.next : head;
    }
}
posted @ 2017-05-01 09:39  北冥尝有鱼  阅读(97)  评论(0编辑  收藏  举报