删除排序链表中的重复元素
链表
题目
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
Related Topics
链表
👍 999
👎 0
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
}
}
思路
- 定义一个dummyNode,dummyNode.next=head,cur=head
- 判断cur.val==cur.next.val,是就删去cur.next节点即可
实现
只能删除一部分重复,无法覆盖所有场景
public ListNode deleteDuplicates(ListNode head) {
ListNode dummyNode = new ListNode();
dummyNode.next= head;
ListNode cur = head;
while (cur!=null &&cur.next!=null){
if (cur.val==cur.next.val){
cur.next = cur.next.next;
}
cur=cur.next;
}
return dummyNode.next;
}
分析
这样会出现问题,只能删除一部分重复,无法覆盖所有场景,由此想到递归
- head=null || head.next=null退出
- head.val=head.next.val,去掉head.next,head.next=head.next.next,head重新放入递归
- head.val!=head.next.val,直接把head.next放入递归即可
优化2
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummyNode = new ListNode();
dummyNode.next = head;
method(dummyNode.next);
return dummyNode.next;
}
private void method(ListNode head){
if (head==null || head.next==null) return;
ListNode cur = head;
if (head.val==head.next.val) {
head.next=head.next.next;
}
else {
cur = head.next;
}
method(cur);
}
}
结果
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:41.9 MB,击败了19.89% 的Java用户