题目链接: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.

这道题的要求是在有序链表中删除有重复数字的节点,留下没有重复的节点。

又是先出现的II题目,是Remove Duplicates from Sorted List的扩展,其实这俩题也都差不多,基础的链表操作。

思路就是找到重复元素,删除即可。如果两个连续节点的数字一样,则循环检测,删除重复的元素,不过最后还需要删除该重复节点一下,因为要求不保留重复节点。

时间复杂度:O(n)

空间复杂度:O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution
{
public:
    ListNode *deleteDuplicates(ListNode *head)
    {
        ListNode *h = new ListNode(0), *p = h;
        h -> next = head;
        
        while(p -> next != NULL)
        {
            if(p -> next -> next != NULL && 
               p -> next -> val == p -> next -> next -> val)
            {
                while(p -> next -> next != NULL && 
                      p -> next -> val == p -> next -> next -> val)
                    p -> next = p -> next -> next;
                p -> next = p -> next -> next;
            }
            else
                p = p -> next;
        }
        
        return h -> next;
    }
};