148. Sort List 链表归并排序
2016-06-19 11:29
369 查看
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ void mergeLink(ListNode* head,ListNode* mid, ListNode* last){ ListNode* head1=head; ListNode* end1 = mid; ListNode* rehead2 = mid->next;//记录第一个链表的结尾 ListNode* head2 = mid->next,*end2 = last; ListNode* temp1,*temp2; while(head1->next!=rehead2){ while(head1->next!=rehead2 && head1->next->val<=head2->val){//当第一个链表小雨第二个链表就一直遍历 head1=head1->next; } if(head1->next == rehead2){//当第一个链表到尾了直接把第二个链表接到第一个链表上 head1->next = head2; break; }else{ temp2 = head2->next; temp1 = head1->next; head1->next = head2; head2->next = temp1; head2 = temp2; head1=head1->next; if(head2 == end2){//当第二个链表到尾了,找到第一个链表的尾然后把第二个链表的尾接到第一个链表的尾 while(head1->next!=rehead2) head1 = head1->next; head1->next = head2; break; } } } } void mergesort(ListNode* head,ListNode* last){ ListNode* fast = head,*slow = head; if(head->next == last || head->next->next==last) return; while(fast!=last && fast->next!=last){//寻找中位数 fast=fast->next->next; slow = slow->next; } mergesort(head,slow->next); mergesort(slow,last); mergeLink(head,slow,last);//合并两个链表 return; } class Solution { public: ListNode* sortList(ListNode* head) { if(head==NULL || head->next == NULL) return head; ListNode* newHead = new ListNode(0); newHead->next = head; mergesort(newHead,nullptr); return newHead->next; } };
相关文章推荐
- HTTP编程常用消息头
- LCD(二) linux驱动分析
- java使用quartz执行任务调度
- git 修改管理
- 同步容器
- 创建存储函数
- Exynos4412 中断驱动开发(二)—— 中断处理流程分析
- Chrome 开发工具之Sources
- 深入剖析ThreadLocal
- Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建
- 寻找地理可视化的引爆点
- Codeforces Round #358 (Div. 2) C. Alyona and the Tree dfs
- 一道简单面试题和霍尔规则
- IT传奇人物
- volatile关键字解析
- Java集合框架的层次结构和使用规则梳理
- C++learning
- Exynos4412 ADC 设备驱动开发
- 吐槽下微软的vs code编辑器
- leetcode_c++:Majority Element II (229)