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;
}
}