LeetCode---4.Sort List

题目链接:https://oj.leetcode.com/problems/sort-list/

解题思路:

因为是要求仅使用常数级的辅助空间,因此只能通过少量的辅助空间在原链表地址上完成排序,并且要求时间复杂度为O(nlogn)。进过思考,最好的解决方案是使用归并排序,这样可以减小链表操作的难度。


代码:

/**
 * 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) {
		int block_size = 1;
		int len = 0;
		ListNode* temp = head;
		ListNode *tmp , *lhead , *rhead = NULL;
		while (temp != NULL) {
			temp = temp->next;
			len++;
		}
		if (len == 0) return head;
		ListNode* virturl_head = new ListNode(0);
		ListNode* last = NULL;
		ListNode* iter = NULL;
		virturl_head->next = head;
		while (block_size < len) {
			int index = 0;
			last = virturl_head;
			iter = virturl_head->next;

			while (index < len) {
				int llen = (len - index) < block_size ? (len - index) : block_size;
				int rlen = (len - index - llen) < block_size ? (len - index - llen) : block_size;
				lhead = iter;
				rhead = NULL;
				if (rlen != 0) {
					for (int i = 0; i < llen - 1; i++) 
						iter = iter->next;
					rhead = iter->next;
					iter->next = NULL;
					iter = rhead;

					for (int i = 0; i < rlen - 1; i++)
						iter = iter->next;
					tmp = iter->next;
					iter->next = NULL;
					iter = tmp;
				}
				while (lhead || rhead) {
					if (rhead == NULL || (lhead != NULL && lhead->val < rhead->val)) {
						last->next = lhead;
						last = last->next;
						lhead = lhead->next;
					}
					else {
						last->next = rhead;
						last = last->next;
						rhead = rhead->next;
					}
				}
				last->next = NULL;
				index += (llen + rlen);
			}
			block_size <<= 1;
		}
		return virturl_head->next;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值