Solution 1
其实和80. Remove Duplicates from Sorted Array II 里面的思路一样,如果有相邻就去掉(跳过)。只是这里使用链表实现其中的数据结构。
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为链表长度,线性遍历
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态变量
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr) { return head; }
auto nextP = head->next;
auto nowP = head;
while (nextP != nullptr) {
if (nextP->val == nowP->val) {
// 前后相等,重复元素,跳过
nowP->next = nextP->next;
} else {
// 前后不相等,不存在重复元素,全部更新
nowP = nextP;
}
nextP = nowP->next;
}
return head;
}
};
Solution 2
Solution 1的Python实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head is None: return head
nextP = head.next
nowP = head
while nextP is not None:
if nextP.val == nowP.val: nowP.next = nextP.next
else: nowP = nextP
nextP = nowP.next
return head