hot100链表类题目
反转链表
题目描述
题目解析
如果 head.next 这个子链表 已经反转过了, 那么怎么操作使得整个链表都反转呢? 自然是将反转后的子链表的 尾部指向 head节点, head.next =None; 这样递归的思想就呼之欲出了!
代码
class Solution: def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:self.head = Nonedef fun(head):if not head or not head.next:self.head = head # 这里收割最后一个节点,作为最终的返回结果return headtail = fun(head.next)tail.next = headhead.next = None # 这个head做为新的tailreturn head fun(head)return self.head
合并两个有序链表
题目描述
题目解析
创建一个新的链表用来存储结果, 创建新链表 最好用一个 dumpy节点,省去很多边界的判断。 用两个指针判断,将小节点接到 新链表之后即可。
代码
class Solution:def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:if not l1 or not l2:return l1 if l1 else l2prehead = pre = ListNode(-1000) # 很小的值while l1 and l2:if l1.val >= l2.val:pre.next = l2l2 = l2.nextelse:pre.next = l1l1 = l1.next pre = pre.next pre.next = l2 if l2 else l1return prehead.next
合并K个有序链表
题目描述
题目解析
把题目转化为 合并两个有序链表即可, 两两进行合并。
代码
class Solution:def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:if len(lists)==0:return Noneif (len(lists)==1):return lists[0]res = lists[0]# 两两进行合并for i in range(1,len(lists)):res = self.merge2List( res, lists[i])return res# 合并两个有序链表def merge2List(self , l1, l2):dumpy = ListNode(0)head = dumpywhile(l1 and l2):if l1.val < l2.val:head.next = l1l1 = l1.nextelse:head.next = l2l2 = l2.nexthead = head.nexthead.next = l1 if l1 else l2return dumpy.next
链表排序
题目描述
题目解析
代码
class Solution:def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:if (not head) or (not head.next):return headleft, right = self.find_mid(head)left = self.sortList(left)right = self.sortList(right)head = self.merge(left, right)return headdef find_mid(self, head): # 快慢指针找中间的节点if (not head) or (not head.next):return head, headslow = headfast = head.next # 注意fast要比slow初始化快一个while (fast and fast.next):slow = slow.nextfast = fast.next.nextright = slow.nextslow.next = Nonereturn head, right def merge(self, left, right):dumpy = ListNode(0)head = dumpywhile (left and right):if left.val < right.val:head.next = leftleft = left.nextelse:head.next = rightright = right.nexthead = head.nextif left:head.next = leftelse:head.next = rightreturn dumpy.next