首页 > 代码库 > 【leetcode】sort list(python)
【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,差距还是比较大的
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。