题目:力扣https://leetcode-cn.com/problems/add-two-numbers/
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry=0;//进位
int sum;
ListNode l3 = new ListNode();
ListNode cur = l3;
while(l1!=null||l2!=null){
if(l1==null){
sum = l2.val+carry;
l2 = l2.next;
}else if(l2==null){
sum = l1.val+carry;
l1 = l1.next;
}else{
sum = l1.val+l2.val+carry;
l1 = l1.next;
l2 = l2.next;
}
ListNode addNode = new ListNode();
addNode.val = sum%10;
carry = sum/10;
cur.next = addNode;
cur = cur.next;
}
if(carry>0){
cur.next = new ListNode(carry);
}
return l3.next;
}
}
思路:建立一个新的列链表,l3的节点的值=l1对应节点的值+l2对应节点的值+进位(carry)。记得对特殊情况进行分类讨论,增强代码的健壮性。
0.题目给定的结构体,后续代码需要参考给定结构体特点编写。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
1.准备工作。定义各个变量,已经声明一个单链表。
carry:表示进位。(例:5+5=10,carry=1;24+34=58,carry=5)
sum:l1.val+l2.val+carry的总和,仅为中间变量。
l3:新的单链表,最后需要返回的单链表。
cur:游标参数,表示实际操作的位置。
int carry=0;//进位
int sum;
ListNode l3 = new ListNode();
ListNode cur = l3;
2.对各种情况进行分类讨论。
若l1和l2不同时为空链,则执行循环。当l1为空时,sum的值仅仅等于l2的值与进位(carry)的和,l2移向下一个节点;当l2为空时,sum的值仅仅等于l1的值与进位(carry)的和,l1移向下一个节点。若l1和l2都不为空,则sum的值等于l1的值、l2的值与carry的值的和,l1和l2都移向下一个节点。
while(l1!=null||l2!=null){
if(l1==null){
sum = l2.val+carry;
l2 = l2.next;
}else if(l2==null){
sum = l1.val+carry;
l1 = l1.next;
}else{
sum = l1.val+l2.val+carry;
l1 = l1.next;
l2 = l2.next;
}
//......(未写)
}
3.建立一个新的节点。因为每个节点只能存一位数,所以对sum值进行对10取余处理,存入新节点。用carry储存进位的数值,用于下一个节点的sum值计算。新节点通过游标连接到l3单链表中,然后游标向后移,指向空,为下一次接入新节点做准备。
ListNode addNode = new ListNode();
addNode.val = sum%10;
carry = sum/10;
cur.next = addNode;
cur = cur.next;
4.循环结束后,对进位(carry)做最后一次判断。若carry仍然大于0,则仍需在链表中新增一个节点储存。
if(carry>0){
cur.next = new ListNode(carry);
}
5.l3链表即使所求,最后返回。
return l3.next;