题目
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
我的想法
核心思想:
用prev指向已经删除重复元素的子list的最后一个结点,temp用来遍历整个list。遍历过程中如果找到不重复的结点,则将其接到prev后,并更新prev指针(始终指向无重复子list的最后一个结点)
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) return head;
ListNode prev = null; //无重复子list的最后一个结点
ListNode temp = head;
int equal; //记录当前重复的数值
if(head.val == head.next.val) equal = head.val;//第一个结点就是重复结点
else equal = head.val - 1;//第一个结点不是重复结点
while(temp != null) {
if(temp.val != equal) { //与上一个结点不重复
//与上一个结点不重复,但是与下一个结点重复
if(temp.next != null && temp.val == temp.next.val) {
if(prev != null) prev.next = null;
equal = temp.val;
temp = temp.next;
continue;
}
//无重复子list有值,则直接把当前结点接在子list之后
if(prev != null) {
prev.next = temp;
prev = temp;
}
//当前无重复子list为空,则将当前结点放入子list中
else {
prev = temp;
head = prev;//头部
}
equal = temp.val;
}
temp = temp.next;
}
return prev == null ? prev : head;
}
}
解答
leetcode solution 1: Recursion
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null) return head;
if(head.next != null && head.next.val == head.val) {//重复
while(head.next != null && head.next.val == head.val)
head = head.next; //找到最后一个重复结点
return deleteDuplicates(head.next);
}
else { //不重复
head.next = deleteDuplicates(head.next);
return head;
}
}
}
leetcode solution 2: Iteration
跟方法1也差不多,方法一用递归代替这里的外层循环
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null) return null;
ListNode FakeHead=new ListNode(0);
FakeHead.next=head;
ListNode pre=FakeHead;
ListNode cur=head;
while(cur!=null){
while(cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
if(pre.next==cur){
pre=pre.next;
}
else{
pre.next=cur.next;
}
cur=cur.next;
}
return FakeHead.next;
}
}