Crack LeetCode 之 148. Sort List

https://leetcode.com/problems/sort-list/

对于链表的排序,非常适合用归并排序算法。但本题还要求只用O(1)的内存空间;如果考虑归并算法的栈的话,实际上本题的解法使用的是O(n)的内存空间。所以本题解法的时间复杂度是O(n Log(n)),空间复杂度是O(n)。其实归并排序也可以使用遍历的方法实现,每次遍历使用不同的步长即可,但是本人懒得修改了~~

C++代码如下:

class Solution {
public:
	ListNode * sortList(ListNode * head) {
		if(head == NULL || head->next == NULL)
			return head;

		ListNode * walker = head;
		ListNode * runner = head;
		while(runner->next!=NULL && runner->next->next!=NULL) {
			walker = walker->next;
			runner = runner->next->next;
		}

		ListNode * head2 = walker->next;
		walker->next = NULL;
		ListNode * head1 = head;
		head1 = sortList(head1);
		head2 = sortList(head2);

		return merge(head1, head2);
	}

	ListNode * merge(ListNode * head1, ListNode * head2) {
		ListNode * helper = new ListNode(0);
		helper->next = head1;
		ListNode * pre = helper;
		while(head1!=NULL && head2!=NULL) {
			if(head1->val<head2->val)
				head1 = head1->next;
			else {
				ListNode * next = head2->next;
				head2->next = pre->next;
				pre->next = head2;
				head2 = next;
			}

			pre = pre->next;
		}
		
		if(head2!=NULL)
			pre->next = head2;

		return helper->next;
	}
};

Python代码如下:

class Solution:
	def sortList(self, head):
		if head == None or head.next == None:
			return head

		walker = head
		runner = head
		while runner.next != None and runner.next.next != None:
			walker = walker.next
			runner = runner.next.next

		head2 = self.sortList(walker.next)
		walker.next = None
		head1 = self.sortList(head)

		return self.merge(head1, head2)

	def merge(self, head1, head2):
		if head1 == None:
			return head2

		if head2 == None:
			return head1

		helper = ListNode(0)
		helper.next = head1
		pre = helper
		while head1 != None and head2 != None:
			if head1.val < head2.val:
				head1 = head1.next
			else:
				next = head2.next
				head2.next = head1
				pre.next = head2
				head2 = next

			pre = pre.next
		
		if head2 != None:
			pre.next = head2

		return helper.next

猜你喜欢

转载自blog.csdn.net/tassardge/article/details/84679832