LeetCode鏈表簡單題

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
相關文章
相關標籤/搜索