两数相加 - 力扣(LeetCode)java

mac2025-05-14  8

问题:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

除了分别指向两个链表的指针A、B,添加一个指向长度更长的链表的指针C,A、B指针向后移动时,C指针都指向A、B下一个非空的结点。这样公共部分处理完后,直接从C指针指向的节点开始处理即可。

用一个进位标志符enter表示上一轮的进位。

java代码:

class ListNode { //结点数据结构 int val; ListNode next; ListNode(int x) { val = x; } } class Solution { //方法 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode A=l1; ListNode B=l2; ListNode result=new ListNode(0); ListNode resultP=result; boolean enter=false; ListNode C=A; while(A!=null&&B!=null){ //先处理公共长度部分的累加 int newNum = enter==true?(A.val+B.val+1)%10:(A.val+B.val)%10; enter = A.val+B.val+(enter?1:0)>=10?true:false; resultP.next=new ListNode(newNum); resultP=resultP.next; A=A.next; B=B.next; C = A==null?B:A; //用C记录长度较长的链表 } while(C!=null){ //处理长度较长的链表尾端 int newNum=enter==true?(C.val+1)%10:C.val%10; enter = C.val+(enter?1:0)>=10?true:false; resultP.next=new ListNode(newNum); resultP=resultP.next; C=C.next; } if(enter==true){ //处理最后的进位 resultP.next=new ListNode(1); resultP=resultP.next; } return result.next; } //main测试 public static void main(String[] args) { ListNode headA=new ListNode(3); ListNode A1=new ListNode(7); ListNode A2=new ListNode(3); headA.next=A1; A1.next=A2; ListNode headB=new ListNode(9); ListNode B1=new ListNode(2); ListNode B2=new ListNode(4); headB.next=B1; B1.next=B2; Solution solu=new Solution(); ListNode result; result=solu.addTwoNumbers(headA,headB); while(result!=null){ System.out.println(result.val); result=result.next; } } }

 

最新回复(0)