单链表的归并排序
来源:互联网 发布:永井豪 知乎 编辑:程序博客网 时间:2024/05/21 11:08
由于单链表没有指向前一个节点的指针,而归并排序排序不需要对前一个节点进行操作,所以归并排序算法很适合用来对单链表排序,代码如下:
#include "stdafx.h"#include <iostream>using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution {public: ListNode *sortList(ListNode *head) { if(head==NULL || head->next==NULL) return head; ListNode* fast=head,*slow=head; while(fast->next!=NULL &&fast->next->next!=NULL) //归并排序,需要用到中间节点,快慢指针是求链表中间节点常用的方法 { fast=fast->next->next; slow=slow->next; } fast=slow; slow=slow->next; fast->next=NULL; ListNode *leftList=sortList(head); ListNode *rightList=sortList(slow); return mergeInsert(leftList,rightList); } ListNode *mergeInsert(ListNode *leftList,ListNode *rightList) { ListNode tmpNode(-1); ListNode *pTemp; for(pTemp=&tmpNode;leftList!=nullptr && rightList!=nullptr;pTemp=pTemp->next) { if(leftList->val<=rightList->val) { pTemp->next=leftList; leftList=leftList->next; } else { pTemp->next=rightList; rightList=rightList->next; } } while(leftList!=nullptr) { pTemp->next=leftList; pTemp=pTemp->next; leftList=leftList->next; } while(rightList!=nullptr) { pTemp->next=rightList; pTemp=pTemp->next; rightList=rightList->next; } return tmpNode.next; }};int _tmain(int argc, _TCHAR* argv[]){struct ListNode head(-1);int inputNodeNum=0;struct ListNode *pHead=&head;Solution sln;while (cin>>inputNodeNum){int valTmp=0;for (int i=0;i<inputNodeNum;++i){cin>>valTmp;pHead->next=new struct ListNode(valTmp);pHead=pHead->next;}struct ListNode* pResult=sln.sortList(head.next);struct ListNode* pTmpResult=pResult;while(pTmpResult!=nullptr){cout<<pTmpResult->val<<" ";pTmpResult=pTmpResult->next;}while(pResult!=nullptr){pTmpResult=pResult;pResult=pResult->next;delete pTmpResult;}}return 0;}
0 0
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 自然归并排序和单链表实现的归并排序
- 单链表的排序(归并排序)
- 单链表的快速排序和归并排序
- 用归并排序实现单链表的排序
- 单链表的归并排序和插入排序
- 归并排序以及归并排序的优化
- 单链表的排序 快速排序 归并排序 quicksort mergesort
- 单链表的归并、快速排序 C++
- Struts2和Servlet在上传文件时的区别
- new,operator new和placement new
- 【问题】未找到与约束~匹配的导出
- 添物不花钱学JavaEE(基础篇)- Servlet
- 用高效流,将一个图片复制到另一个路径
- 单链表的归并排序
- EventBus的使用及 解决异常Subscriber ****has no public methods called **
- C++之离港篇学习笔记之内存管理
- python lambda函数 与 函数式编程
- pycharm中对于no module named xxx的解决方法
- Spring AOP 实现原理
- 以太帧、ip帧、udp/tcp帧、http报文结构
- 实验环境配置
- 嵌入式linux 项目开发(一)——CGIC编程