java单链表排序归并排序_单链表排序--归并排序

#include

#include

using namespace std;

struct ListNode //默认为public

{

int data;

ListNode* next;

ListNode(int x, ListNode* nextNode):data(x), next(nextNode){}

};

ListNode* mergeData(ListNode* first, ListNode* second)

{

if(first == nullptr) return second;

if(second == nullptr) return first;

//合并两个链表,按从小到大的顺序

ListNode* new_head = new (nothrow) ListNode(0, nullptr); //分配失败返回空指针

if(new_head == nullptr) exit(0);

ListNode* ptr = new_head;

while(first != nullptr && second != nullptr)

{

if(first->data < second->data)

{

ptr->next = first;

first = first->next;

}

else

{

ptr->next = second;

second = second->next;

}

ptr = ptr->next;

}

//合并剩余部分(对于数组进行归并排序,这部分可通过设置哨兵来省略)

if(first != nullptr) ptr->next = first;

if(second != nullptr) ptr->next = second;

return new_head->next;

}

//返回为结点指针类型,需要链表头节点

ListNode* mergeSort(ListNode* head)

{

//递归调用,首先找到分裂点,对于链表可以使用快慢指针方法

if(head == nullptr || head->next == nullptr) return head;

ListNode* fast = head->next;

ListNode* slow = head;

while(fast != nullptr && fast->next != nullptr)

{

slow = slow->next;

fast = fast->next->next;

}

//此时slow即为中间点,依次对slow之前的元素和之后的元素递归调用归并排序,然后进行合并

ListNode* se = slow->next;

slow->next = nullptr;

ListNode* first = mergeSort(head);

ListNode* second = mergeSort(se);

return mergeData(first, second);

}

void printList(ListNode* head)

{

if(head == nullptr) return;

cout << head->data << " ";

printList(head->next);

}

int main()

{

ListNode* head =

new ListNode(10, new ListNode(9, new ListNode(8, new ListNode(7, new ListNode(6, new ListNode(5, nullptr))))));

printList(head);

cout << endl;

ListNode* new_head = mergeSort(head);

printList(new_head);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值