描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路1:迭代
题目比较简单。
1.首先检查是不是空链表,是则直接返回head,不是则继续执行。
2.先定义一个ListNode类型的指针,指向当前操作的结点。
3.如果当前链表有下一节点则执行while,在while中判断当前结点的val值和下一结点的val值是否相同,相同则更改当前结点的指向为下下结点,不相同则指针递增。
4.遍历了一遍链表,所以时间复杂度O(n),仅开辟了一个结点空间,空间复杂度O(1)。
解答1
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head) return head;
ListNode* point = head;
while(point->next){
if(point->next->val == point->val)
point->next = point->next->next;
else point = point->next;//注意不能用point ++,因为链表在内存中地址不连续
}
return head;
}
};
思路2:递归
引用评论区高票答案:
- 找终止条件:当head指向链表只剩一个元素的时候,自然是不可能重复的,因此return
- 想想应该返回什么值:应该返回的自然是已经去重的链表的头节点
- 每一步要做什么:宏观上考虑,此时head.next已经指向一个去重的链表了,而根据第二步,我应该返回一个去重的链表的头节点。因此这一步应该做的是判断当前的head和head.next是否相等,如果相等则说明重了,返回head.next,否则返回head
解答2
/**
* 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 || head->next == NULL) return head;//head==NULL为了适应输入空链表的情况
head->next = deleteDuplicates(head->next);
if(head->val == head->next->val){
head = head->next;//或者head->next = head->next->next
}
return head;
}
};