二、删除排序链表中的重复元素 II
1.遍历
由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外设定一个头节点。在我们遍历的过程中,如果遇到一个节点的值和它下一个节点的值相同,我们就先记录下这个节点的前一个节点,然后继续向后寻找直到找到不和这个节点值相同的结点,然后让之前记录的前一个节点的next指向这个不相同的节点即可,具体代码如下:
/*** 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) {if(head == null || head.next == null) {return head;}ListNode p = new ListNode();p.next = head;ListNode pre = p;ListNode cur = p.next;while(cur != null) {if(cur.next != null && cur.val == cur.next.val) {while(cur.next != null && cur.val == cur.next.val) {cur = cur.next;}pre.next = cur.next;cur = cur.next;} else {pre = pre.next;cur = cur.next;}}return p.next;}
}
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。