删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
解答
双指针法:设置两个指针cur和pre遍历链表,cur指向当前节点,pre指向当前节点前一个节点,比较pre->val和cur->val的值:
- pre->val != cur->val,此时cur指向下一个不重复的节点,令pre的next指向cur指向的当前节点,这样就跳过了重复的节点,同时pre前进一步(
pre = pre->next
); - pre->val == cur->val, 此时cur仍然指向重复的节点,cur继续前进直到找到不重复的节点
- 时间复杂度:O(n)
- 空间复杂度:O(1)
C++代码
/**
* 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 nullptr;
ListNode* pre = head;
ListNode* cur = head->next;
while(cur)
{
if(cur->val != pre->val)
{
pre->next = cur;
pre = pre->next;
}
cur = cur->next;
}
if(pre->next)
pre->next = nullptr;
return head;
}
};
Python代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return head
pre = head
cur = head.next
while cur:
if cur.val != pre.val:
pre.next = cur
pre = pre.next
cur = cur.next
pre.next = None
return head