题目描述:
思路:
- 对于有序序列去重的通用解法使用的是双指针技巧当中的快慢指针技巧
- 慢指针走在后面,快指针走在前面,找到一个不重复的元素就告诉slow并让slow走一步,然后进行"赋值"
代码实现:
class Solution {
public int removeDuplicates(int[] nums) {
// 先判断特殊情况
if (nums.length == 0){
return 0;
}
int slow = 0;
int fast = 0;
// 快指针依次往后面移动, 进行一次次ZQ的判断,
while (fast < nums.length){
// 快指针和慢指针所指的值进行比较
if (nums[fast] != nums[slow]){
slow++;
// 维护nums中的值没有重复的
nums[slow] = nums[fast];
}
fast++;
}
// 下标是从0开始的,数组长度还要加1
return slow + 1;
}
}
小总结:
- 原地删除可以使用赋值语句来实现,
- 快慢指针方法可以解决很多问题
题目描述:
思路:
- 和上题其实是完全一样的,只是把数组赋值操作变成了操作指针而已
代码实现:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null){
return null;
}
ListNode slow = head;
ListNode fast = head;
while (fast != null){
if (fast.val != slow.val){
slow.next = fast;
// 慢指针也要往后面移动才可以
slow = slow.next;
}
fast = fast.next;
}
// 因为最后返回的是一个结果链表,所有最后一个指针后面需要弄成null
slow.next = null;
return head;
}
}



