题目描述
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
方法思路
只要是重复的,要将重复的元素一个不留的删除
Approach1:非递归的解决方案
class Solution {
//Runtime: 0 ms, faster than 100.00%
//Memory Usage: 37.5 MB, less than 57.51%
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode dummy = new ListNode(0);
ListNode cur = head, pre = dummy;
dummy.next = head;
boolean flag = true;
while(cur != null && cur.next != null){
if(cur.val == cur.next.val){
flag = false;
cur = cur.next;
continue;
}else{
if(!flag){
pre.next = cur.next;
flag = true;
cur = cur.next;
}else{
pre = cur;
cur = cur.next;
}
}
}
if(flag == false)//针对以重复结点结束的链表
pre.next = null;
return dummy.next;
}
}
上下两个代码是相同思路的不同实现,区别不大,下面的更简洁易懂一些
class Solution{
//use two pointers, pre - track the node before the dup nodes,
//cur - to find the last node of dups.
public ListNode deleteDuplicates(ListNode head) {
if(head==null) return null;
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode pre=dummy;
ListNode cur=head;
while(cur!=null){
//loop to find the last node of the dups.
while(cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
if(pre.next==cur){
//no dup, move down both pointer.
pre=pre.next;
}
else{
//duplicates detected,remove the dups.
pre.next=cur.next;
}
cur=cur.next;
}
return dummy.next;
}
}
Approach2: recursive
class Solution{
//Runtime: 0 ms, faster than 100.00%
//if current node is not unique, return deleteDuplicates with head.next.
//If current node is unique, link it to the result of next list made by recursive call.
public ListNode deleteDuplicates(ListNode head) {
if (head == null) return null;
if (head.next != null && head.val == head.next.val) {
while (head.next != null && head.val == head.next.val) {
head = head.next;
}
return deleteDuplicates(head.next);
} else {
head.next = deleteDuplicates(head.next);
}
return head;
}
}