单链表与顺序表,单向链表排序
BM12单链表的排序描述给定一个节点数为n的无序单链表,对其按升序排序。
数据范围:
要求:时间复杂度
示例一输入:
{1,3,2,4,5}复制返回值:
{1,2,3,4,5}复制
示例2输入:
{-1,0,-2}复制返回值:
{-2,-1,0}题解思路:
对于链表的排序,其实也可以借鉴数组排序。比如冒泡排序、插入排序、选择排序等也可以很容易的在链表上使用。这里借鉴归并排序的思想对链表进行排序。通过以下几个步骤完成:
找到链表的尾节点以头尾节点为参数进行归并排序归并排序:找到头尾节点的中间节点,以中间节点为界将链表划分成2部分,一定要将中间节点的然后指针设置为空对划分后的2个链表分别使用归并排序,得到2个有序的链表将2个有序链表连接起来,得到新的有序链表排序完成#包含位/标准数据h。
结构列表节点
{
int值
结构列表节点*下一个
ListNode(int x) : val(x),next(nullptr)
{
}
ListNode()=默认值;
};
void swap_node(ListNode *left,ListNode *right)
{
标准:交换(左值,右值);
}
ListNode * find _ mid _ node(ListNode * left,ListNode *right)
{
ListNode * slow=left
ListNode * fast=left
而(快!=右快速-下一个!=右)
{
慢=慢-下一个;
fast=fast-next-next;
}
返回慢;
}
ListNode * link _ sorted _ list(ListNode * left,ListNode *right)
{
if (left==nullptr)
{
向右返回;
}
if (right==nullptr)
{
向左返回;
}
如果(左阀右阀)
{
返回链接排序列表(右,左);
}
自动头=左;
自动尾节点=头
left=left-next;
//这里其实是可以优化的,当某一个链表的指针为空的时候,跳出循环,然后直接让尾节点-下一个指向非空链表即可!
而(左!=nullptr 对!=nullptr)
{
if (left==nullptr)
{
auto next=right-next;
tail _ node-next=right;
tail _ node=tail _ node-next;
右=下;
继续;
}
if (right==nullptr)
{
auto next=left-next;
tail _ node-next=left;
tail _ node=tail _ node-next;
左=下;
继续;
}
如果(左值=右值)
{
tail _ node-next=left;
left=left-next;
tail _ node=tail _ node-next;
}
其他
{
tail _ node-next=right;
右=右-下;
tail _ node=tail _ node-next;
}
}
回程头;
}
ListNode * merge _ sort(ListNode * left,ListNode *right)
{
if (left==nullptr)
{
向右返回;
}
if (right==nullptr)
{
向左返回;
}
if (left==right)
{
向左返回;
}
自动中间节点=查找中间节点(左,右);
auto next _ node=mid _ node-next;
mid _ node-next=nullptr;
自动pre_list=merge_sort(左,中_ node);
auto after _ list=merge _ sort(next _ node,右);
返回link_sorted_list(pre_list,after _ list);
}
列表节点*排序列表(列表节点*头)
{
if(head==nullptr head-next==nullptr)
{
回程头;
}
auto cur _ node=头
while (cur_node- next!=nullptr)
{
cur _ node=cur _ node-next;
}
返回merge_sort(head,cur _ node);
}
ListNode * create _ list(const STD:vector int v)
{
链表结点头;
ListNode * phead=head
用于(自动数据:五)
{
自动节点=新列表节点
节点值=数据;
node-next=nullptr;
phead-next=node;
phead=phead-next;
}
返回头,下一个
}
int main()
{
//auto list=create _ list(STD:vector int { 105,25,89,67,49,38,52 });
auto list=create _ list(STD:vector int { 1,3,2,4,5 });
auto head=sortin list(列表);
而(头!=nullptr)
{
STD:cout head-val " ";
head=head-next;
}
STD:cout STD:endl;
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。