【一次过】Lintcode 113. 删除排序链表中的重复数字 II

39 篇文章 0 订阅
33 篇文章 0 订阅

给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。

样例

给出 1->2->3->3->4->4->5->null,返回 1->2->5->null

给出 1->1->1->2->3->null,返回 2->3->null

解题思路:

    照例新建一个dummy节点作为首部,然后用两个指针left与right分别指向重复元素的前一个元素和重复元素的后一个元素,使得(left , right)之间为重复元素。如果中间没有重复元素则向后考察元素,如果有则将left.next = right即可删除中间重复元素。

    始终注意right不要越界问题!

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param head: head is the head of the linked list
     * @return: head of the linked list
     */
    public ListNode deleteDuplicates(ListNode head) {
        // write your code here
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        
        //使得(left,right)之间的元素是重复的数字,前开后开
        ListNode left = dummy;//指向重复元素的前一个元素
        ListNode right = head;
        
        while(right != null){
            right = right.next;
            
            //如果重复,将right指针指向重复元素的后一个元素
            while(right != null && left.next.val == right.val)
                right = right.next;
            
            if(left.next.next == right) //如果两指针间不存在重复元素,则继续移动两指针
                left = left.next;
            else  //如果两指针间存在重复元素,则将left与right连接,删除重复元素
                left.next = right;
        }
        
        return dummy.next;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值