算法思想
没看答案
这是一个简单的问题,仅测试你操作列表的结点指针的能力。由于输入的列表已排序,因此我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。
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):
curr = head
while(curr):
a = curr.val
temp = curr.next
if not temp:
break
b = temp.val
if a == b:
curr.next = temp.next
else:
curr = curr.next
return head
C++
/**
* 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) {
ListNode * curr = head;
while(curr != nullptr && curr->next != nullptr){
if (curr->val == curr->next->val){
curr->next = curr->next->next;
}else{
curr = curr->next;
}
}
return head;
}
};
复杂度分析:
- 时间复杂度:O(n),因为列表中的每个结点都检查一次以确定它是否重复,所以总运行时间为 O(n),其中 n 是列表中的结点数。
- 空间复杂度:O(n),因为声明了中间指针temp。