17、删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

我的未优化的代码

public static  ListNode deleteDuplicates(ListNode head) {
		if(head == null){
			return null;
		}else {
			ListNode listNode = head.next;
			ListNode s1 = new ListNode(head.val);
			ListNode s3 = s1;
			while (listNode != null) {
				int value = head.val;
				if(value ==  listNode.val){
					System.out.println("相等");
					listNode = listNode.next;
				}else {
					System.out.println("不相等");
					 ListNode s2 = new ListNode(listNode.val);
					 s1.next = s2;
					 s1 = s2;
					 head = listNode;
					 listNode = listNode.next;
					 
				}
				
				
			}	
			return s3;
		}
    }
	

经过优化过后的代码

不知道为什么会提高这么多,只是将空间复杂度降低了。。。

public static  ListNode deleteDuplicates(ListNode head) {
		
		
		ListNode s4 = head;
		
		if(head == null){
			return null;
		}else {
			ListNode listNode = head.next;
			while (listNode != null) {
				int value = head.val;
				if(value ==  listNode.val){
					listNode = listNode.next;
					head.next = null;
				}else {
					
					
					head.next = listNode;
					head = listNode;
					listNode = listNode.next;
					 
				}
			
			}	
			return s4;
		}
    }
	

排名靠前的代码,不得不说这个代码简单易懂,好吧,不是很容易懂,但是执行效率高

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //递归到底
        if (head == null) {
            return head;
        }

        head.next=deleteDuplicates(head.next);
        if ( head.next!=null && head.val== head.next.val) {
            return head.next;
        }

        return head;
    }
}

19年7月13日重置版本,使用next这样就避免了申请很多的内存nice


class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        
		ListNode root = new ListNode(-1);
		root.next = head;
		ListNode tem = root;
		while (root.next != null && root.next.next != null) {
			if(root.next.val == root.next.next.val){
				root.next = root.next.next;
			}else {
				root = root.next ;
			}
		}
		return tem.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值