148-链表排序
Posted nxnslc-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了148-链表排序相关的知识,希望对你有一定的参考价值。
看题就发蒙了,在题目给定的复杂度情况下,使用归并排序进行处理。
题中的链表处理,要学会断开链表,即一个链表断成两块,如何设置断点,分成两个链表的处理方法
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* sortList(ListNode* head) { 12 return mergesort( head); 13 14 } 15 ListNode* mergesort(ListNode* node) 16 { 17 if(!node||!node->next) 18 { 19 return node; 20 } 21 ListNode* fast=node; //快指针走两步 22 ListNode* slow=node; //慢指针走一步 23 ListNode* brek=node; //断点,fast走到末尾时候slow走到中间,刚好传给断点,整个链表分成两块 24 while(fast&&fast->next) 25 { 26 fast=fast->next->next; 27 brek=slow; 28 slow=slow->next; 29 } 30 brek->next=NULL; 31 ListNode* l1=mergesort(node); 32 ListNode*l2=mergesort(slow); 33 return merge(l1,l2); 34 } 35 ListNode* merge(ListNode *l1, ListNode* l2) 36 { 37 //递归到底的情况 38 if(l1==NULL) 39 { 40 return l2; 41 } 42 if(l2==NULL) 43 { 44 return l1; 45 } 46 //分情况递归实现 47 if(l1->val<l2->val) 48 { 49 l1->next=merge(l1->next,l2); 50 return l1; 51 } 52 else 53 { 54 l2->next=merge(l2->next,l1); 55 return l2; 56 } 57 } 58 };
以上是关于148-链表排序的主要内容,如果未能解决你的问题,请参考以下文章