链表题

leetcode 1

输入数字个位在链表头,返回数字个位在链表尾部

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        res = ListNode(-1)
        p = res
        carry = 0
        while l1 or l2 or carry!= 0 :
            if not l1:
                num1 = 0
            else:
                num1 = l1.val
                l1 = l1.next
            if not l2:
                num2 = 0 
            else:
                num2 = l2.val
                l2 = l2.next             
            sums = num1 + num2 + carry
            carry = sums // 10
            curr = sums % 10 
            node = ListNode(curr)
            p.next = node
            p = p.next
        return res.next

leetcode 445

输入数字个位在末尾,返回数字个位在链表尾部

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        s1 ,s2 = [],[]
        while l1:
            s1.append(l1.val)
            l1 = l1.next
        while l2:
            s2.append(l2.val)
            l2 = l2.next
        res,carry = None,0
        
        while s1 or s2 or carry!= 0:
            num1 = 0 if not s1 else s1.pop()
            num2 = 0 if not s2 else s2.pop()
            sums = num1 + num2 + carry
            carry = sums // 10
            curr = sums % 10 
            node = ListNode(curr)
            node.next = res
            res = node
        return res
  • 这里要将链表转化为列表来做。
  • 另一个技巧点是s1.pop()这个用法,既取到了后面的数字,又去掉了数字
  • 还有将链表穿起来时,每一次新生成的节点的next置为上次的结果

82: 删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

这道题和他的相似题目(简单)的区别在于,只要出现重复,那么就要删除链表中所有的节点,一个都不允许留。比如:输入:head = [1,2,3,3,4,4,5],删除后要输出:[1,2,5]。简单题目是要留下一个。

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        dummy = ListNode()
        dummy.next = head
        same = None
        p = head
        pre = dummy
        while p :
            nexxt = p.next
            if nexxt and nexxt.val == p.val or nexxt and nexxt.val==same:
                same = nexxt.val
                pre.next = nexxt.next
                p = pre
                continue
            pre = p
            p = p.next
        return dummy.next

这里我用了一个same变量来保存我删除的节点是什么值,这么做的目的在于,很可能删除这俩一样的元素之后,后面紧跟着又是一个相等值的元素,那这个时候其实这个第三个元素也是需要删除的。
之前same=nexxt.val这个地方我写的是same = p.val。一开始想的是既然两个值都一样,只要保存他们的相同值就可以了,但是如果是if条件的第二个情况满足,这个same值就不会变化了。这样就会出现一个问题,那就是如果是[1,1,1,1]这种情况,最后一个1还是会输出,那这样结果就不对了。愿意在于,这里的p是可能为dummy空节点的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2. 两数相加[https://leetcode-cn.com/problems/add-two-numbers/...
    longls777阅读 217评论 0 0
  • 给出两个 非空 的链表用来表示两个非负的整数。 其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点...
    zaoa阅读 73评论 0 1
  • 题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个...
    SaltyFishDmer阅读 686评论 0 0
  • leecode 第二题 给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并...
    历十九喵喵喵阅读 263评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,620评论 28 53