链表实现相同元素的删除,合并无序链表
知识点链表
说明删除给定链表中的重复元素(链表中的元素按从小到大的顺序排列),使链表中的所有元素只出现一次。
例如:
给定的链表是,并且返回。
给定的链表是,并且返回。
数据范围:链表的长度满足,链表中任意节点的值满足高级:空间复杂度和时间复杂度。
示例1输入:
{1,1,2}复制返回值:
{1,2}复制
2示例输入:
{}复制返回值:
{}解决问题的思路:
这里有两种解决方案:
利用集合的特性提供一个比较模仿函数,遍历链表,把所有的节点放在集合中,然后从集合中取出所有的节点。可以参考删除数组中重复元素的方式,比较当前节点是否等于下一个节点,将当前节点直接指向next- next,将当前节点指向下一个节点。使用set # include bits/stdc . h的实现。
结构列表节点
{
int val
struct ListNode * next
ListNode(int x) : val(x),next(nullptr)
{
}
ListNode()=默认值;
};
Cmp级
{
公共:
bool运算符()(const ListNode *left,const ListNode *right)
{
返回左值右值;
}
};
ListNode * delete duplicates _ 1(ListNode * head)
{
std:set ListNode *,Cmp s。
而(头!=nullptr)
{
s.insert(头);
head=head-next;
}
head=nullptr
ListNode * tail _ node=head
而(!s.empty()
{
if (head==nullptr)
{
head=* s . begin();
tail_node=头;
}
其他
{
tail _ node-next=* s . begin();
tail _ node=tail _ node-next;
}
s . erase(s . begin());
}
if (tail_node!=nullptr)
{
tail _ node-next=nullptr;
}
回程头;
}前后指针值比较的实现#include bits/stdc。h
结构列表节点
{
int val
struct ListNode * next
ListNode(int x) : val(x),next(nullptr)
{
}
ListNode()=默认值;
};
ListNode * delete duplicates(ListNode * head)
{
auto cur _ node=head
while (cur_node!=nullptr)
{
if (cur_node- next==nullptr)
{
打破;
}
if(当前节点值==当前节点下一个值)
{
cur _ node-next=cur _ node-next-next;
}
其他
{
cur _ node=cur _ node-next;
}
}
回程头;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。