LeetCode链表简单题

一、21合并两个有序链表

代码如下:

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

二、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 # 返回删除重复元素后的链表

三、141环形链表

# 解题思路;利用快慢指针,一个指针快,另一个慢,若链表有环,则总有相遇的时候
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时退出

四、160相交链表

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

五、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 # 返回新的链表

六、234回文链表

# 用快慢指针的方法找到链表的中间节点,然后将后半段链表进行反转,在判断
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

 

你可能感兴趣的:(LeetCode链表简单题)