码迷,mamicode.com
首页 > 其他好文 > 详细

Remove Duplicates from Sorted List II

时间:2015-03-03 20:29:59      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list-ii/

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

解题思路:

这道题与前面的Remove Duplicates from Sorted List相似,却采用了不同的思路。Remove Duplicates from Sorted List 是当前节点与前面的值比较,如果比前面的大,就加入。而本题是,当前节点与后面节点相比,如果后面节点比当前节点大,而且当前节点比再前一个值小,就加入。代码如下。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null){
            return null;
        }
        
        ListNode dummyNode = new ListNode(head.val - 1);
        dummyNode.next = head;
        ListNode preNode = dummyNode;
        ListNode currentNode = head;
        ListNode nextNode = head.next;
        ListNode keepNode = preNode;

        while(nextNode != null){
            if(preNode.val < currentNode.val && currentNode.val < nextNode.val){
                keepNode.next = currentNode;
                keepNode = keepNode.next;
            }
            preNode = preNode.next;
            currentNode = currentNode.next;
            nextNode = nextNode.next;
        }
        
        //循环结束,这时preNode为倒数第二个节点,currentNode为最后一个节点
        if(preNode.val < currentNode.val){
            keepNode.next = currentNode;
            keepNode = keepNode.next;
        }
        keepNode.next = null;
        return dummyNode.next;
    }
}

这道题的关键在于要时刻保留三个指针,只有中间那个的值大于前面的并且小于后面的,才能加入中间那个节点。还需要注意最后一轮,preNode为倒数第二个节点,currentNode为最后一个节点的时候,要再加一次判断。最后,一定要注意,把keepNode.next置为null,否则遇到1-1这样的要出错。

下面的代码是另一种实现,思路略微不同,但是代码要复杂很多。当前节点与后面节点相比,如果后面节点比当前节点大,就要把当前节点加入。如果相等的话,把当前值作为重复值(invalidValue),这样在判断1-3-3-4-4这样情况的的第二个3时,虽然后面的4大于当前的3,但是3==invalidValue,所以3不能加入。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null){
            return null;
        }
        
        ListNode dummyNode = new ListNode(head.val - 1);
        dummyNode.next = head;
        ListNode keepNode = dummyNode;
        ListNode traverseNode = dummyNode.next;
        int invalidVal = dummyNode.val;
        
        while(traverseNode != null){
            //如果traverseNode的后一个节点为空
            if(traverseNode.next == null){
                //看看traverseNode本身是不是重复的节点,不是就加入
                 if(traverseNode.val != invalidVal){
                    keepNode.next = traverseNode;
                    keepNode = keepNode.next;
                    traverseNode = traverseNode.next;
                 }else{
                     traverseNode = traverseNode.next;
                 }
            }else{
                //traverseNode的后一个节点大于它,就把它加入,还要注意1-3-3-4-4,traverseNode在第二个3的情况
                //所以要加入一个invalidVal记录当前的重复值,不能加入
                if(traverseNode.next.val > traverseNode.val && traverseNode.val != invalidVal){
                    keepNode.next = traverseNode;
                    keepNode = keepNode.next;
                    traverseNode = traverseNode.next;
                }else{//如果traverseNode的后一个节点等于它
                    invalidVal = traverseNode.val;
                    traverseNode = traverseNode.next;
                }
            }
        }
        keepNode.next = null;
        return dummyNode.next;
    }
}

 

Remove Duplicates from Sorted List II

标签:

原文地址:http://www.cnblogs.com/NickyYe/p/4311259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!