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
.Solution:
The idea is to keep two pointers.
One points to the current non-duplicate node.
The other points to the candidate node.
Keep advancing the second pointer to the next non-duplicate node.
Connect these two nodes. (In this way we skip the duplicated nodes)
The time complexity is O(n).
Code:
/** * 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; } ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy; ListNode curr = head; while (curr != null) { while (curr.next != null && curr.val == curr.next.val) { curr = curr.next; } if (pre.next == curr) { pre = pre.next; } else { pre.next = curr.next; } curr = curr.next; } return dummy.next; } }