您的位置:首页 > 其它

LeetCode :: Remove Duplicates from Sorted List[详细分析]

2014-03-24 23:31 260 查看
Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,

Given
1->1->2
, return
1->2
.

Given
1->1->2->3->3
, return
1->2->3
.

这道题目,可以和之前的LeetCode :: Remove Duplicates from Sorted Array [详细分析]进行比较,可以发链表这个动态数据结构在动态性能上面是优于数组的。单看删除这一步,只需要花费O(1)的时间,之前的Array使用的删除方法不是真正的删除,因为Array的有效位后面还有残留一些无用数据,而链表这里是可以完完全全删除的。(当成链表的查找时间是O(N)而数组是O(1))。

注意:链表问题经常会在指针转换指向对象的时候,因为顺序之类的问题导致无限绕圈循环的Runtime Error,每次都应该注意。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL)
            return NULL;
        ListNode *p = head;
        while (p != NULL && p -> next != NULL){
            ListNode *q = p -> next;
            if (q -> val == p -> val){
                p -> next = q -> next;
                delete q;  //记得释放掉无用内存空间。不释放可以AC,但是不是好的编程风格。
            }
            else  //只有当不重复时候往后走一位,不然一直原地“吞并”。
                p = p -> next;
        }
        return head;
    }
    
};
第一次写的时候RUNTIME ERROR ,错在case {1 ,1}上。附上错误代码分析一下:

错误的地方有两个: 1.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL)
            return NULL;
        ListNode *p = head;
        while (p -> next != NULL){
            ListNode *q = p -> next;
            if (q -> val == p -> val){
                p -> next = q -> next;
                delete q;
            }
        p = p -> next;
        }
        return head;
    }
    
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: