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 };
View Code

猜你喜欢

转载自www.cnblogs.com/nxnslc-blog/p/12393872.html
今日推荐