1.題目
題目地址(83. 刪除排序連結串列中的重複元素 - 力扣(LeetCode))
https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
題目描述
給定一個已排序的連結串列的頭 head
, 刪除所有重複的元素,使每個元素只出現一次 。返回 已排序的連結串列 。
示例 1:
輸入:head = [1,1,2] 輸出:[1,2]
示例 2:
輸入:head = [1,1,2,3,3] 輸出:[1,2,3]
提示:
- 連結串列中節點數目在範圍
[0, 300]
內 -100 <= Node.val <= 100
- 題目資料保證連結串列已經按升序 排列
2.題解
2.1 一次遍歷
思路
這裡遍歷連結串列,遇到重複的就刪除重複的後一個節點,且當前節點cur不移動(防止接著的一個節點又等於cur->val)
否則我們向後移動cur,繼續遍歷。
程式碼
- 語言支援:C++
C++ Code:
* 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;
ListNode *cur = head, *nt = head->next;
while(cur->next != nullptr){
if(cur->val == cur->next->val){
ListNode *temp = cur->next;
cur->next = temp->next;
delete temp;
}else{
cur = cur->next;
}
}
return head;
}
};
複雜度分析
令 n 為陣列長度。
- 時間複雜度:\(O(n)\)
- 空間複雜度:\(O(n)\)