关闭

对链表进行排序

81人阅读 评论(0) 收藏 举报
分类:

对链表进行排序:

参考的思路是来自于这位“哥们 ”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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15129次
    • 积分:728
    • 等级:
    • 排名:千里之外
    • 原创:55篇
    • 转载:23篇
    • 译文:2篇
    • 评论:6条
    最新评论