删除排序链表(或数组)中的重复元素
题目描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2
分析
- 第一种方法:暴力法解决,依次从链表中取元素,再拿该元素对链表顺序匹配,时间复杂度为O(n^2),但凡有点算法基础,都不会采用这种策略,因为太der了…
- 像这种线性结构的算法题,如数组、链表等,我们有更强大的策略去解决这种问题 - 双指针
直接看代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head==null) return head ; //判空
ListNode headCopy = head ;
/* *在Java中,操作链表,需要使用引用,以保持head的内部结构指向不被修改
*引用(copy)直接修改的是head的内存,而返回的head始终保持指向第一个结点
*C++则也是创建一个copy链表来操作,保持head的内部结构指向不被修改*/
while (headCopy.next!=null){
if (headCopy.val == headCopy.next.val){
//立即删除head结点
headCopy.val = headCopy.next.val ;
headCopy.next = headCopy.next.next ;
//保持快慢指针不动
}else {
headCopy = headCopy.next ;
}
}
return head ; //返回head而不是headcopy
}
}
为了更加直观的体现我们的双指针,我把代码改成下面这种形式
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head==null) return head ; //判空
ListNode headCopy = head ;
/* *在Java中,操作链表,需要使用引用,以保持head的内部结构指向不被修改
*引用(copy)直接修改的是head的内存,而返回的head始终保持指向第一个结点
*C++则也是创建一个copy链表来操作,保持head的内部结构指向不被修改*/
while (headCopy.next!=null){
int pslow = headCopy.val ;
int pfast = headCopy.next.val ;
if (pslow == pfast){
//立即删除head结点
headCopy.val = headCopy.next.val ;
headCopy.next = headCopy.next.next ;
}else {
headCopy = headCopy.next ;
}
}
return head ; //返回head而不是headcopy
}
}