问题:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
}
}
}