给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
下面是java代码的实现,此处用的是原地算法,算法是自己写的,博客也是自己写的,如有错误欢迎指正,如需转载,请标注出处,谢谢!
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//判断链表是否为空或者是否是只有一个节点,如果是则返回head即可
if(head == null || head.next == null)
return head;
ListNode pre = null,p = head,res = head;
while(p != null && p.next != null){
//如果出现相同的元素
if(p.val == p.next.val){
//遍历到相同元素的最后一个节点 比如说有三个2,则遍历到第三个2的节点处
while(p.next != null && p.val == p.next.val)
p = p.next;
//与pre进行连接的节点
p = p.next;
//如果从头开始到现在一直都是重复元素,那么pre是null,那么p要设置为头结点
if(pre == null){
res = p;
}
//如果不是 那么将pre的下一个节点指定为p即可
else{
pre.next = p;
}
}
//如果没出现相同的元素,那么进行正常的遍历,注意pre
else{
pre = p;
p = p.next;
}
}
return res;
}
}
下面是提交的结果,因为是原地算法,执行速度还是比较快的。
显示详情
执行用时 :2 ms, 在所有 Java 提交中击败了92.69%的用户
内存消耗 :37.8 MB, 在所有 Java 提交中击败了38.61%的用户