Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Return the linked list sorted as well.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
难度:中等
自己的解法思路:
算是暴力解法吧,遍历整个链表,保存前驱结点,遇到重复段跳过。
子问题:例如:122233,前驱结点为1,当前结点p指向前驱结点的后继,也就是第一个2,找到当前段重复元素的最后一个结点,即第3个2,令p指向它。
若出现重复,p后移,进入下一个子问题。
若没有重复,令前驱结点的后继指向当前结点,令当前结点为前驱结点,p后移,进入下一个子问题。还有个小bug,具体往下看。
/**
* 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) {
ListNode* preHead=new ListNode(-1);
ListNode* preNode=preHead;//前驱结点
ListNode* p=head;//当前结点
while(p)//一次子问题
{
int x=p->val;
bool flag=true;//flag标志是否存在重复
while(p->next&&x==p->next->val)
{
p=p->next;
flag=false;
}//p指向重复段的最后一个结点
if(flag)
{
preNode->next=p;
preNode=p;
}
p=p->next;
preNode->next=nullptr; //进入下一个子问题前将前驱结点的后继置空
}
return preHead->next;
}
};
preNode->next=nullptr; //进入下一个子问题前将前驱结点的后继置空
如果没有这一句
当最后一段存在重复时会出现问题,如图,1的后继未清空,子问题全部结束,最后一段重复依然存在。此解法虽然有两层循环,实际上只遍历了一次。故时间复杂度为O(L)
emmmm。。。。也不知道为什么内存消耗这么大,欢迎大佬指点
duplicate | 重复 |
---|