当前位置: 首页 > 后端技术 > Python

[LeetCode-2-Medium]AddTwoNumbers

时间:2023-03-26 19:29:39 Python

题目要求给你两个非空链表,分别代表两个非负整数。这些数字以相反的顺序存储,并且它们的每个节点都包含一个数字。将这两个数字相加并将其作为链表返回。您可以假设这两个数字不包含任何前导零,除了数字0本身。给定两个非空链表,用于表示两个非负整数。其中,它们各自的位数倒序存储,它们的每个节点只能存储一位数。如果,我们将这两个数字相加,将返回一个新的链表来表示它们的和。你可以假设除了数字0之外,这两个数字都不以0开头。链接:https://leetcode-cn.com/probl...示例输入:(2->4->3)+(5->6->4)输出:7->0->8解释:342+465=807输入:(2->4->3)+(5->6->4)输出:7->0->8原因:342+465=807解题思路本题为比较一个整数所加题采用链表形式呈现。我想到的方法是遍历两个链表。每两个数相加后,会产生一个进位,进位进位到下一轮继续使用。同时,计算出的结果会成为新链表的节点,比如4和6相加,进位1带入下一轮继续使用,0成为新链表的节点之一新的链表。整体难度不是很大。注意考虑两个链表的长度不相等。链表也可能在循环结束时产生一个进位。新节点出现,使用附加节点保存头节点来解决这个问题。示例代码:Java版/***单链表定义。*公共类ListNode{*intval;*接下来是ListNode;*ListNode(intx){val=x;}*}*/classSolution{publicListNodeaddTwoNumbers(ListNodel1,ListNodel2){ListNodecurrent=newListNode(0);列表节点p=l1,q=l2;进位=0;ListNodedumpHead=current;//额外的虚拟节点用于保存头节点,因为最后要做的是返回while(p!=null||q!=null){intnumber1=(p!=null)?p.val:0;intnumber2=(q!=null)?q.val:0;int结果=数字1+数字2+进位;进位=结果/10;ListNodenext=newListNode(result%10);当前.下一个=下一个;当前=当前.下一个;//继续向下移动//原来的两个链表的节点继续向下移动if(p!=null){p=p.next;}if(q!=null){q=q.next;}}//如果加上最后一个链表的编号,还有Enter如果(进位>0){current.next=newListNode(进位);}返回dumpHead.next;}}Python版本#单链表的定义。#classListNode:#def__init__(self,x):#self.val=x#self.next=Noneclass解决方案:defaddTwoNumbers(self,l1:ListNode,l2:ListNode)->ListNode:current=ListNode(0)dumpHead=currentp=l1q=l2carry=0whileporq:number1=(p.valifpelse0)number2=(q.valifqelse0)result=number1+number2+carrycarry=result//10current.next=ListNode(result%10)current=current.next如果p不是None:p=p.next如果q不是None:q=q.next如果进位:current.next=ListNode(carry)returndumpHead.next复杂度分析:时间复杂度:O(max(m,n)),m和n分别为两个链表的长度,最多循环max(m,n)空间复杂度:O(max(m,n)),因为引入了额外的链表存储,最大存储空间为max(m,n)+1,因为最后一位可能会额外生成新的节点。标记哑节点链表