python每日一题练习

昨天一直在做PPT 真是PPT之王了 写个简单题(我打算今天学动态规划 但是今天聚餐,明天要写一下动态规划 tag)

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

思路很简单 就是双指针 如果后面的这个指针指向的节点的值 等于前一个指针指向的节点的值 那么就后面的指针往后移动 然后断开 蛮简单

class ListNode(object):
    def __init__(self, val=0, next=None):
         self.val = val
         self.next = next
class Solution(object):
    def deleteDuplicates(self, head):
        dummy=head
        dummy1=head.next
        while dummy.next!=None:
            if dummy1.val==dummy.val:
                dummy1=dummy1.next
                dummy.next=dummy1
            else:
                dummy1=dummy1.next
                dummy=dummy.next
        return head
def array_to_linked_list(arr):
    if not arr:
        return None
    head = ListNode(arr[0])
    current = head
    for val in arr[1:]:
        current.next = ListNode(val)
        current = current.next
    return head
def print_linked_list(head):
    current = head
    while current:
        print(current.val)
        current = current.next

solution=Solution()
result=[1,1,2]
result=array_to_linked_list(result)
result=solution.deleteDuplicates(result)
print_linked_list(result)

先不管题目要输出格式是如何的 这样写肯定是有问题的 很容易导致dummy1的空指针风险 其实一个指针就够了 如果这个指针指向的节点的值 和这个指针下一个节点的值是相同的 就断开就行

而且还要考虑空指针和只有一个节点的指针的情况 【我开始以为是要链表转数组 结果题目要求竟然是直接返回链表 】

# Definition for singly-linked list.

class Solution(object):

    def deleteDuplicates(self, head):

        if head==None :

            return None

        if head.next==None:

            return head

        dummy=head

        while dummy.next!=None and dummy.next.next!=None:

            if dummy.val==dummy.next.val:

                dummy.next=dummy.next.next

            else:

                dummy=dummy.next

        if dummy.next.next==None:

            if dummy.val==dummy.next.val:

                dummy.next=None

        return head

#数组转链表

def array_to_linked_list(arr):

    if not arr:

        return None

    head = ListNode(arr[0])

    current = head

    for val in arr[1:]:

        current.next = ListNode(val)

        current = current.next

    return head

#打印链表

def print_linked_list(head):

    current = head

    while current:

        print(current.val)

        current = current.next

#链表转数组

def linked_list_to_array(head):

    array = []

    current = head

    while current:

        array.append(current.val)

        current = current.next

    return array

solution=Solution()

result=[1,1,2]

result=array_to_linked_list(result)

result=solution.deleteDuplicates(result)#这个结果是return head

#然后需要进行链表转数组

代码很简单 就是考虑好一些情况就行 然后我们一起分析一下运算速度第一的代码

# Definition for singly-linked list.
class Solution(object):
    def deleteDuplicates(self, head):
        if head==None :
            return None
        if head.next==None:
            return head
        dummy=head
        while dummy.next!=None and dummy.next.next!=None:
            if dummy.val==dummy.next.val:
                dummy.next=dummy.next.next
            else:
                dummy=dummy.next
        if dummy.next.next==None:
            if dummy.val==dummy.next.val:
                dummy.next=None
        return head
#数组转链表
def array_to_linked_list(arr):
    if not arr:
        return None
    head = ListNode(arr[0])
    current = head
    for val in arr[1:]:
        current.next = ListNode(val)
        current = current.next
    return head
#打印链表
def print_linked_list(head):
    current = head
    while current:
        print(current.val)
        current = current.next
#链表转数组
def linked_list_to_array(head):
    array = []
    current = head
    while current:
        array.append(current.val)
        current = current.next
    return array
solution=Solution()
result=[1,1,2]
result=array_to_linked_list(result)
result=solution.deleteDuplicates(result)#这个结果是return head
#然后需要进行链表转数组

自我感觉 跟我的区别不大 好的 先写个简单题 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值