对链表进行排序

对链表进行排序:

参考的思路是来自于这位“哥们 ”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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值