Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given
Given
Given
1->2->3->3->4->4->5, return 1->2->5.Given
1->1->1->2->3, return 2->3.Understand the problem:
The problem asks for removing duplicated numbers from a linked list. Note the the difference from the last post is all duplicated numbers are deleted. For example,
1 -> 1 -> 1 -> 2 , return 2
For an empty linked list, return null
For a linked list with only 1 element, return the original linked list.
Solution:
We still use two pointers, p and q. q pointer is one step ahead of p at beginning. Move q pointer if q is duplicated. If q pointer moves more than one steps (has duplicates), move p.next = q.next. Else, move p and q one step ahead. The crux is to determine if q moves multiple steps. If yes, it means q pointer has duplicates, we should jump the q pointer. Else, q pointer should be saved. For example,
0 -> 1 -> 2 ->3, where p and q points to 0 and 1, respectively. Since 1 has no duplicates afterwards, we move both p and q one step ahead.
0 -> 1 -> 1 -> 2 -> 3, where again p and q points to 0 and 1, respectively. Since now i has duplicates afterwards, we should jump the 1s and points p to the value of 2.
Code (Java):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) return head;
ListNode helper = new ListNode(0);
helper.next = head;
head = helper;
ListNode p = head;
ListNode q = head.next;
while (q != null) {
while (q.next != null && q.val == q.next.val) {
q = q.next;
}
if (p.next != q) {
p.next = q.next;
if (q != null) q = q.next;
} else {
p = p.next;
q = q.next;
}
}
return head.next;
}
}
Discussion:
Note that we used a helper node ahead of the head node. This is to avoid the complexities in deleting the head node, which may be the case for this question. Using helper node is a common usage when updating the head node.
Updates on 10/7/14:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummyNode = new ListNode(Integer.MIN_VALUE);
dummyNode.next = head;
ListNode prev = dummyNode;
ListNode curr = head;
while (curr != null && curr.next != null) {
ListNode next = curr.next;
if (curr.val == next.val) {
while (curr.next != null && curr.val == next.val) {
curr = curr.next;
next = next.next;
}
prev.next = next;
curr = next;
} else {
prev = prev.next;
curr = curr.next;
}
}
return dummyNode.next;
}
}
Hi,
ReplyDeletePlease clarify this for me, please?
if (head == null || head.next == null) {
return head;
}
can we return null instead of head?
see, return type is ListNode
Delete