LintCode 112.删除排序链表中的重复元素

LintCode 112.删除排序链表中的重复元素

思路
二重循环遍历每一种情况

  • 外层循环控制每个节点的处理
  • 内层循环是从这个节点的下一个节点开始的遍历判断,如果相同则删除
/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param head: head is the head of the linked list
     * @return: head of linked list
     */
    ListNode * deleteDuplicates(ListNode * head) {
        // write your code here
        ListNode *p = head;
        ListNode *s = NULL;
        while(p != NULL)
        {
            s = p->next;
            while(s != NULL)
            {
                if(s->val == p->val)    //删除s节点
                {
                    p->next = s->next;
                    delete s;
                    s = p->next;
                }
                else
                {
                    s = s->next;
                }
                
            }
            p = p->next;
        }
        return head;
    }
};

思路简单,效率不高

附上参考答案

/**
* 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
* - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/ 

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution{
public:
    /**
     * @param head: The first node of linked list.
     * @return: head node
     */
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL) {
            return NULL;
        }

        ListNode *node = head;
        while (node->next != NULL) {
            if (node->val == node->next->val) {
                node->next = node->next->next;
            } else {
                node = node->next;
            }
        }
        return head;
    }
};

读到这个代码的时候再往回看题目的时候才发现题目的是排序链表,也就是相同的数字是在一起的,真的是坑。。。

大致思路一样,如果数字相同,就跳到下一个继续判断是否相同,否则判断下一个数字。
注意边界情况的处理:如果head本身为NULL,直接返回NULL;

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param head: head is the head of the linked list
     * @return: head of linked list
     */
    ListNode * deleteDuplicates(ListNode * head) {
        // write your code here
        if(head == NULL)
        {
            return NULL;
        }
        ListNode *p = head;
        while(p->next != NULL)
        {
            if(p->val == p->next->val)
            {
                p->next = p->next->next;
            }
            else
            {
                p = p->next;
            }
           
        }
        return head;
       
    }
};

但是某些重复的节点空间并没有释放