【LeetCode】Remove Duplicates from Sorted List系列

83. Remove Duplicates from Sorted List

介绍

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.

题意: 删除链表中的重复元素, 有多个重复元素存在时候, 只需要保留一个就可以了.

解答

下面这个方法主要是先确定两个值不相等的节点, 如果节点之间的距离不等于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)   return head;
        ListNode *fast = head->next, *slow = head;

        while(fast)
        {
            if(fast->val != slow->val && slow->next != fast)
            {
                ListNode *temp = slow->next;
                slow->next = temp->next;
                delete temp;
            }else if(slow->val == fast->val)
            {
                fast = fast->next;
            }else 
            {
                slow = slow->next;
                fast = fast->next;
            }
        }

        while(slow->next != fast)
        {
            ListNode *temp = slow->next;
            slow->next = temp->next;
            delete temp;
        }
        return head;
    }
};

82. 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.

题意: 删除所有的重复元素. 不同于上一道题的是, 如果链表中存在重复的值val, 那么所有值等于val的节点都要被删除.

解答

有两个要点:
1. 添加一个辅助节点作为头结点, 可以帮助我们处理头结点是重复值得问题.
2. 有两个指针pre指向最后一个有效节点, cur指向第一个和pre后一个节点值不等的节点,如果两者距离超过1, 说明pre后的节点是重复的, 我们只要从pre->next得到cur之前的所有链表节点.

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head)
    {
        if( !head || !(head->next) ) return head;

        ListNode *newHead = new ListNode(0);
        newHead->next = head;
        ListNode *pre = newHead, *cur = head->next;

        while(cur)
        {
            if( pre->next->val == cur->val)
            {
                cur = cur->next;
            }
            else if(pre->next->next == cur)
            {
                pre = pre->next;
                cur = cur->next;
            }else   //删除从pre->next得到cur之前的所有链表节点
            {
                pre->next = cur;
                cur = cur->next;
            }
        }
        if(pre->next->next != cur)
        {
            pre->next = cur;
        }
        return newHead->next;
    }
  };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值