对链表进行排序

来源:互联网 发布:软件工程硕士排名 编辑:程序博客网 时间:2024/04/27 20:38

对链表进行排序:

参考的思路是来自于这位“哥们 ”https://leetcode.com/discuss/92326/share-my-c-concise-solutions-easy-to-understand


</pre><pre name="code" class="cpp">/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *sortList(ListNode *head) {if(head == NULL){return head;}ListNode *rt =  Sort(head);return rt;    }ListNode * Sort(ListNode *begin ){//找到链表中间的位置if(begin == NULL){return NULL;}//链表只有一个元素,直接返回if(begin->next == NULL){return begin;}ListNode *fast_ptr = begin->next ;//注意这里快指针要先走一步ListNode *slow_ptr = begin ;//两个快慢指针,将量表拆分成为两个部分while(fast_ptr->next != NULL){fast_ptr = fast_ptr->next->next;slow_ptr = slow_ptr->next;if(fast_ptr == NULL){// 注意这里也一定要判断,不然会段错误break;}}        fast_ptr = slow_ptr->next;slow_ptr->next = NULL;ListNode *l1 = Sort(begin );ListNode *l2 = Sort(fast_ptr);//将两个排序的链表合并成为一个链表ListNode dump(0);ListNode * l = &dump;while(l1 != NULL && l2 != NULL){if(l1->val < l2->val ){l->next = l1 ;l = l->next;l1 = l1->next;}else {l->next = l2;l = l->next;l2 = l2->next;}}if(l1 != NULL){l->next = l1;}if(l2 != NULL){l->next = l2;}return dump.next;//注意这里返回的是新的链表}void Print(ListNode * l){while(l != NULL){cout<<l->val <<" ";l = l->next;}cout<<endl;}};


0 0
原创粉丝点击