zoukankan      html  css  js  c++  java
  • 【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,差距还是比較大的


  • 相关阅读:
    杭电 1596 find the safest road (最短路)
    回溯法——求解N皇后问题
    iptables apache2
    POJ 2586 Y2K Accounting Bug(枚举大水题)
    JAVA学习第十九课(java程序的异常处理 (二))
    XHTML中button加入超链接以及使插入图片与屏幕一样大
    每天一个JavaScript实例-apply和call的使用方法
    【HDU 5384】Danganronpa(AC自己主动机)
    小心APP应用让你成为“透明人”
    第一讲:使用html5——canvas绘制奥运五环
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5384318.html
Copyright © 2011-2022 走看看