删除有序链表中重复的元素-II

 删除有序链表中重复的元素-I:http://t.csdn.cn/IZXJm

题意:

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1 \to 2\to 3\to 3\to 4\to 4\to51→2→3→3→4→4→5, 返回1\to 2\to51→2→5.
给出的链表为1\to1 \to 1\to 2 \to 31→1→1→2→3, 返回2\to 32→3.

数据范围:链表长度 0 \le n \le 100000≤n≤10000,链表中的值满足 |val| \le 1000∣val∣≤1000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

示例:

输入:

{1,2,2}

返回值:

{1}

题解:由于需要删除所有重复节点,包括第一个出现的节点,所以引入新节点作为头节点,

对于每个节点i,往后遍历找到与节点i不相等的节点j,通过判断节点i,j位置看i节点是否重复,如果重复,i节点的上一个节点pre直接指向j节点,舍弃掉重复节点。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
        // write code here
         ListNode pre=null,h=null,t=null,next=null;
        t=new ListNode(-1);
        t.next=head;
        pre=t;
        h=head;
        while(head!=null)
        {
            next=head.next;
         
            while(next!=null&&next.val==head.val)
            {
                next=next.next;
            }
            if(head.next==next)
            {
                pre=head;
                head=head.next;
                
            }
            else {
                pre.next=next;
                head=next;
            }
        }
        h=t.next;
       return h;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值