题目:
Given a sorted linked list, delete all duplicates such that each element appear only once.
Example 1:
Input: 1->1->2
Output: 1->2
Example 2:
Input: 1->1->2->3->3
Output: 1->2->3
题解:
这道题是经典的双指针问题,用两个指针一前一后指向链表。如果两个指针指向的值相等,那么就让第二个指针一直往后挪,挪到与第一个指针不同为止。然后让第一个指针的next指向第二个指针,两个指针同时往后挪,进行下面的操作。
需要注意,当list的结尾几个node是重复的时候,例如1->2->3->3,那么ptr2会指向null,需要特殊处理,令ptr1.next = null,这样list尾部就不会丢。
其他情况就不用特殊处理结尾了,因为结尾没有重复值,只须遍历就够了,不用特殊处理尾部。
代码如下:
public class RemoveDuplicatesfromSortedList {
public static void main(String[] args) {
/**
* Example 1:
*
* Input: 1->1->2 Output: 1->2
*/
ListNode head1 = new ListNode(1);
ListNode ln11 = new ListNode(1);
ListNode ln12 = new ListNode(2);
head1.next = ln11;
ln11.next = ln12;
LeetCodeUtil.printNodeList(deleteDuplicates(head1));
/**
* Example 2:
*
* Input: 1->1->2->3->3 Output: 1->2->3
*/
ListNode head2 = new ListNode(1);
ListNode ln21 = new ListNode(1);
ListNode ln22 = new ListNode(2);
ListNode ln23 = new ListNode(3);
ListNode ln24 = new ListNode(3);
head2.next = ln21;
ln21.next = ln22;
ln22.next = ln23;
ln23.next = ln24;
LeetCodeUtil.printNodeList(deleteDuplicates(head2));
}
public static ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode ln1 = head, ln2 = head.next;
while (ln2 != null) {
if (ln1.val == ln2.val) {
ln2 = ln2.next;
if (ln2 == null) {
ln1.next = null;
}
} else {
ln1.next = ln2;
ln1 = ln1.next;
ln2 = ln2.next;
}
}
return head;
}
}