Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.
题意:有一个含有重复元素的升序链表,重复的元素只保留一个,返回去重后的升序链表。
思路:这道题和Remove Duplicates from Sorted Array很类似,我们还是可以用两个指针,一个指针pre指向当前已去重排序好的位置,一个指针dummy遍历链表。每次遍历比较pre和dummy的值,如果不相等,证明dummy是pre之后不重复的升序值,可以将pre.next连接到dummy,此时从头到dummy这部分就是已去重的升序链表了,所以再把pre指向dummy;如果相等,证明pre到dummy这部分都相等,继续遍历,期待找到下一个不相等的值。
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = head;
ListNode dummy = head.next;
while (dummy != null) {
if (pre.val != dummy.val) {
pre.next = dummy;
pre = dummy;
}
dummy = dummy.next;
}
pre.next = null;
return head;
}
bug:自己最后少写了pre.next = null这步,这会导致在1->2->3->3这样的case下,返回的结果还是1->2->3->3。因为我们只能保证从头到pre是去重排序好的,所以最后需要把pre.next置为null。