1、21合併兩個有序鏈表app
代碼以下:spa
class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: # 首先對特殊狀況進行處理,l1 l2 爲空的時候 if not (l1 and l2) : # 這個表達式的意思只要l1 l2 不全爲真就符合條件 return l1 or l2 elif l1.val > l2.val: # 判斷哪個值比較小,而後保留哪一項 l2.next = self.mergeTwoLists(l2.next,l1) # 遞歸思想的精髓 return l2 # 返回小的這一項 else : l1.next = self.mergeTwoLists(l1.next,l2) return l1 # 注意:l1 l2 表示的不是整個鏈表,而只是每個結點 # 這個是別人給的題解,大佬寫的很好。 class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if l1 and l2: # 判斷l1 是否爲空 if l1.val > l2.val : l1,l2 = l2,l1 # 始終讓l1 爲小值 l1.next = self.mergeTwoLists(l1.next,l2) # 遞歸的精髓 return l1 or l2
2、83刪除鏈表重複的元素指針
class Solution: def deleteDuplicates(self, head: ListNode) -> ListNode: if not head :return head # 首先判斷鏈表是否爲空,若爲空直接返回 head1 = head l = [] # 定義一個空的列表 用來存放已經遍歷過的鏈表結點 l.append(head.val) # 將遍歷過的鏈表結點添加進入列表中 while head and head.next: # 當前結點和下一個結點都爲真繼續 if head.next.val in l : # 若下一節點的值已經在列表中 head.next = head.next.next # 進行刪除操做,跳過下一節點,直接指向下下結點 else: l.append(head.next.val) # 將結點添加進入列表 head = head.next # 進行遍歷 return head1 # 返回刪除重複元素後的鏈表
3、141環形鏈表code
# 解題思路;利用快慢指針,一個指針快,另外一個慢,若鏈表有環,則總有相遇的時候 class Solution(object): def hasCycle(self, head): """ :type head: ListNode :rtype: bool """ if not head or not head.next : # 若鏈表中沒有元素,或者只有一個元素,則不可能成環 return False fast = head slow = head while fast: if fast.next == None: # 若快指針能夠走到頭,則確定沒有環 return False else : fast = fast.next.next # 快指針每次走兩步 slow = slow.next # 慢指針走一步 if slow == fast: # 當快慢指針相遇 return True return False # 當快指針爲None時退出
4、160相交鏈表blog
class Solution(object): def getIntersectionNode(self, headA, headB): """ :type head1, head1: ListNode :rtype: ListNode """ if not headA or not headB: # 若兩個鏈表中其中一個鏈表爲空則不可能相交 return None length1 = 0 # 用來接收headA鏈表的長度 length2 = 0 h1 = headA h2 = headB while h1: # 遍歷鏈表算出兩個鏈表的長度 length1 += 1 h1 = h1.next while h2: length2 += 1 h2 = h2.next if length1 > length2: # 讓比較長的鏈表先走 for i in range(length1 - length2): headA = headA.next elif length1 < length2: for i in range(length2 - length1): headB = headB.next while headA: # 如今兩個指針處於同一位置 if headA == headB: # 判斷是否爲同一節點 return headA headA = headA.next headB = headB.next return None
5、203移除鏈表元素遞歸
class Solution(object): def removeElements(self, head, val): """ :type head: ListNode :type val: int :rtype: ListNode """ if not head:return head # 判斷是否爲空鏈表 head1 = head # 用head1返回新的鏈表 while head: # 找到第一個不須要刪除的鏈表 if head.val == val: # 須要刪除時,將head1等於head的下一節點 head1 = head.next head = head.next else: break while head and head.next: # 進行鏈表的遍歷,進行刪除所給的元素 if head.next.val == val: head.next = head.next.next else : head = head.next return head1 # 返回新的鏈表
6、234迴文鏈表rem
# 用快慢指針的方法找到鏈表的中間節點,而後將後半段鏈表進行反轉,在判斷 class Solution: def isPalindrome(self, head: ListNode) -> bool: if not head or not head.next : # 若鏈表爲空或爲一個元素,則鏈表爲迴文鏈表 return True fast = head slow = head # 快慢指針 快指針走兩步,慢指針走一步 while fast and fast.next: fast = fast.next.next slow = slow.next mid = slow # 此時slow爲中點指針 pre = None # 將後半段鏈表表反轉 while slow: slow.next,pre,slow = pre,slow,slow.next # 不能夠分開寫成三個語句,Python特有,在C語言中這樣寫是錯誤的 # 他們這三個語句的執行是相同,沒有前後之分。 # 此時後半段列表的頭指針爲pre while head != mid: if head.val != pre.val: return False pre = pre.next head = head.next return True