[LeetCode] Sort List

问题:

Sort a linked list in O(n log n) time using constant space complexity.

分析:

用divide and conquer。首先遍历一次,找到长度;然后遍历一半,找到中间点;然后在左右两半recursion,然后merge。

Time complexity: T(n) = 2T(n/2) + n = O(n log n)。

代码:

ListNode *mergeList(ListNode *left, ListNode *right) {
	ListNode dummy(0);
	ListNode *curr = &dummy;
	while (left || right) {
		if (!left) {
			curr->next = right;
			break;
		}
		if (!right) {
			curr->next = left;
			break;
		}
		int l = left->val;
		int r = right->val;
		if (l < r) {
			curr->next = left;
			left = left->next;
			curr = curr->next;
		}
		else {
			curr->next = right;
			right = right->next;
			curr = curr->next;
		}
	}
	return dummy.next;
}

class Solution {
public:
    ListNode *sortList(ListNode *head) {
		if (!head)
			return head;
		int n = 0;
		ListNode *curr = head;
		while (curr) {
			n ++;
			curr = curr->next;
		}
		if (n == 1)
			return head;
		int half = n / 2;
		curr = head;
		for (int i = 0; i < half; i ++) {
			curr = curr->next;
		}
		ListNode * right = curr->next;
		curr->next = NULL;
		ListNode * left = sortList(head);
		right = sortList(right);
		return mergeList(left, right);
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值