力扣热题100之排序链表
题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
代码
方法一:
用列表存值,然后再排序,最后遍历列表原地改值
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:if not head:return Nonehead_list=[]dummy=ListNode(0,head)cur=dummy.nextwhile cur:head_list.append(cur.val)cur=cur.nexthead_list.sort()i=0cur=dummy.nextwhile cur:cur.val=head_list[i] i+=1cur=cur.nextreturn dummy.next
方法二:
首先将原链表分为两段,然后分别通过递归合并对这两段链表进行排序,最后合并两段链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:def merge(left,right):dummy=ListNode(0)temp=dummywhile left and right:if left.val<right.val:temp.next=leftleft=left.nextelse:temp.next=rightright=right.nexttemp=temp.nexttemp.next= left if left else rightreturn dummy.nextif not head or not head.next:return headslow=headfast=head.nextwhile fast and fast.next:slow=slow.nextfast=fast.next.nextmid=slow.nextslow.next=Noneleft=self.sortList(head)right=self.sortList(mid)return merge(left,right)