力扣83. 删除排序链表中的重复元素(链表操作)
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路:
//如果重复元素,则last指针不变,phead往右移一,跳过重复元素
//如果不是重复元素,则last和phead都要往右移一
复杂度分析:
时间复杂度:O(n),因为列表中的每个结点都检查一次以确定它是否重复,所以总运行时间为 O(n),其中 nn 是列表中的结点数。
空间复杂度:O(1),没有使用额外的空间。
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
ListNode* deleteDuplicates(ListNode* head)
{
//鲁棒性,如果head为空,则返回空
if (head == nullptr) return head;
//last从第一个结点开始,因为如果只有一个结点的话,不会删除
ListNode* last = head;
//当前结点phead,从第二个结点(可能是空结点)开始
ListNode* phead = head->next;
//循环结束条件是当前结点到末尾,如果没到末尾就继续循环
while (phead)
{
//如果重复元素,则last指针不变,phead往右移一,跳过重复元素
if (phead->val== last->val)
{
last->next = phead->next;
phead = phead->next;
}
//如果不是重复元素,则last和phead都要往右移一
else
{
last = phead;
phead = phead->next;
}
}
return head;
}
};
int main()
{
ListNode head[7] = { 1, 2, 2, 2, 8, 8, 8 };
head[0].next = &head[1]; head[1].next = &head[2]; head[2].next = &head[3];
head[3].next = &head[4]; head[4].next = &head[5]; head[6].next = &head[7];
cout << "原链表:"<<'\n';
ListNode* headtemp = head;
while (headtemp)
{
cout << headtemp->val << '\t';
headtemp = headtemp->next;
}
cout << '\n' << "删除重复链表:" << '\n';
Solution s;
auto result = s.deleteDuplicates(head);
ListNode* resulttemp = result;
while (resulttemp)
{
cout << resulttemp->val << '\t';
resulttemp = resulttemp->next;
}
return 0;
}
本文详细解析了力扣第83题“删除排序链表中的重复元素”的解题思路和算法实现,通过示例展示了如何遍历链表并删除重复元素,确保每个元素仅出现一次,提供了一个简洁高效的解决方案。
&spm=1001.2101.3001.5002&articleId=105581300&d=1&t=3&u=5417b560e3cb4f24a50599981f1c2878)
176

被折叠的 条评论
为什么被折叠?



