两个有序链表,删除链表中的重复元素
删除有序链表中的重复元素
知识点链表
以升序描述一个链表,删除链表中所有重复的元素,只保留原链表中只出现一次的元素。
例如:
给定的链表是,并且返回。
给定的链表是,并且返回。
数据范围:链表的长度,链表中的值满足要求:空间复杂度,时间复杂度高级:空间复杂度,时间复杂度。
示例1输入:
{1,2,2}返回值:
{1}
2示例输入:
{}返回值:
{}解决方案使用计数器解决问题的想法:
遍历整个链表,用计数器统计重复的节点,如果节点数为1,则添加到链表中。实现如下:
#包含位/标准数据。h
结构列表节点
{
int val
struct ListNode * next
ListNode(int x) : val(x),next(nullptr)
{
}
ListNode()=默认值;
};
ListNode * delete duplicates(ListNode * head)
{
if(head==nullptr head-next==nullptr)
{
回程头;
}
ListNode * first _ node=nullptr
ListNode * tail _ node=nullptr
ListNode * cur _ node=head
int count=1;
while (cur_node!=nullptr)
{
if (cur_node- next==nullptr)
{
if (count==1)
{
if (first_node==nullptr)
{
first _ node=cur _ node
first _ node-next=nullptr;
}
其他
{
tail _ node-next=cur _节点;
}
}
其他
{
if (tail_node!=nullptr)
{
tail _ node-next=nullptr;
}
}
打破;
}
其他
{
auto next _ node=cur _ node-next;
if(当前节点值==下一个节点值)
{
数数;
cur _ node=next _ node
}
其他
{
if (count==1)
{
if (first_node==nullptr)
{
first _ node=cur _ node
tail _ node=cur _节点;
tail _ node-next=nullptr;
}
其他
{
tail _ node-next=cur _节点;
tail _ node=tail _ node-next;
}
}
count=1;
cur _ node=next _ node
}
}
}
返回第一个节点;
}使用快慢指针的解决思路:双指针:fast检测并跳过重复节点,slow指向最后一个已经检查过的节点,slow- next=fast删除重复节点。难点:头节点也可能被删除。在这里的头前加一个虚拟头vhead,让slow先指向vheadlistnode * delete duplicates(listnode * head)。
{
ListNode * v head=new ListNode(0);
vHead-next=head;
ListNode * fast=head
ListNode * slow=vHead
while(快速快速-下一个)
{
if (fast- next- val!=快速阀)
{//检测fast指向的节点是否重复。
慢=快;//不要重复,向前慢一步
fast=fast-next;
}
其他
{
int repeat val=fast-val;//记录重复值,让fast跳过所有值相同的节点。
while(快速快速值==重复值)
{
fast=fast-next;
}
slow-next=fast;//注意,fast所指向的节点此时可能仍然是重复的,所以slow不动。
}
}
返回vHead-next;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。