• 【leetcode】sort list(python)


    链表的归并排序

    超时的代码

    class Solution:
    	def merge(self, head1, head2):
    		if head1 == None:
    			return head2
    		if head2 == None:
    			return head1
    		# head1 and head2 point to the same link list
    		if head1 == head2:
    			return head1
    	
    		head = None
    		tail = None
    		# the small pointer point to smaller of two.
    		while head1 and head2:
    			if head1.val <= head2.val:
    				small = head1
    				head1 = head1.next
    			else:
    				small = head2
    				head2 = head2.next
    			# the first node
    			if tail == None:
    				tail = small
    				head = small
    			else:
    				tail.next = small
    				tail = small
    		# link the remaind nodes
    		if head1 == None:
    			head1 = head2
    	
    		tail.next = head1
    		return head
    		
    	def sortList(self, head):
    		if head == None or head.next == None:
    			return head
    		# we use a fast pointer which go two steps each time and 
    		# a slow pointer which go one step each time to get the 
    		# middle of the link list
    		slow = head
    		fast = head
    		while fast.next and fast.next.next:
    			fast = fast.next.next
    			slow = slow.next
    		# slow point to the middle now
    		head2 = slow.next
    		# we cut of the linked list at middle
    		slow.next = None
    		
    		left = self.sortList(head)
    		right = self.sortList(head2)
    		return self.merge(left, right)

    主要是在merge的时候。要推断第一个结点

    AC代码

    class Solution:
    	def merge(self, head1, head2):
    		if head1 == None:
    			return head2
    		if head2 == None:
    			return head1
    		# head1 and head2 point to the same link list
    		if head1 == head2:
    			return head1
    	
    		head = ListNode(-1)
    		tail = head
    		# the small pointer point to smaller of two.
    		while head1 and head2:
    			if head1.val <= head2.val:
    				small = head1
    				head1 = head1.next
    			else:
    				small = head2
    				head2 = head2.next
    			
    			tail.next = small
    			tail = small
    		# link the remaind nodes
    		if head1 == None:
    			head1 = head2
    	
    		tail.next = head1
    		return head.next
    		
    	def sortList(self, head):
    		if head == None or head.next == None:
    			return head
    		# we use a fast pointer which go two steps each time and 
    		# a slow pointer which go one step each time to get the 
    		# middle of the link list
    		slow = head
    		fast = head
    		while fast.next and fast.next.next:
    			fast = fast.next.next
    			slow = slow.next
    		# slow point to the middle now
    		head2 = slow.next
    		# we cut of the linked list at middle
    		slow.next = None
    		
    		left = self.sortList(head)
    		right = self.sortList(head2)
    		return self.merge(left, right)

    这里merge的时候建立了一个伪头结点,处理的时候就不用推断是否为第一个结点,尽管AC,但时间5500ms以上。而c++代码仅仅须要200多ms,差距还是比較大的


  • 相关阅读:
    Eclipse_debug异常_Source not found
    Mybatis异常_01_Invalid bound statement (not found)
    [转]Eclipse快捷键_01_常用快捷键汇总
    PL/SQL学习笔记_03_存储函数与存储过程
    PL/SQL学习笔记_02_游标
    PL/SQL学习笔记_01_基础:变量、流程控制
    Oracle学习笔记_05_分组函数
    博客园_01_为博客园添加目录的方法总结
    Oracle学习笔记_04_多表查询
    Oracle学习笔记_03_单行函数
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5384318.html
Copyright © 2020-2023  润新知