我们首先创建一个虚拟头节点dummy
,它的主要作用是简化边界条件的处理。然后,我们使用一个循环来遍历两个链表,同时考虑进位。在循环中,我们计算当前位的和(包括从上一个计算中可能遗留下来的进位),然后更新进位和当前节点。如果两个链表中的某个链表已经遍历完,我们将对应的值视为0。最后,我们返回虚拟头节点的下一个节点,它实际上是结果链表的头节点
代码如下:
public class addNumber {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy=new ListNode(0);//创建一个虚拟头节点
ListNode cur=dummy; //当前操作节点初始化为虚拟头节点
int carry=0; //进位初始化为0
while(l1!=null || l2!=null||carry>0){
int x=l1!=null?l1.val:0;// 如果l1不为空则取l1的值否则取0
int y=l2!=null?l2.val:0;
int sum=x+y+carry;//计算当前位的和(包括进位)
carry=sum/10;
cur.next=new ListNode(sum%10); //创建新节点存储当前位的值
cur=cur.next; //移动到下个节点
if(l1!=null) l1=l1.next;
if(l2!=null) l2=l2.next;
}
return dummy.next;//返回虚拟头节点的下一个节点作为结果链表的头节点
}
}
注意这里的三元运算符,简化了运算。
cur.next= new ListNode(sum%10) 其实你就可以理解成 cur.next=sum%10;
标签:150,ListNode,cur,相加,next,l2,l1,节点,两数 From: https://blog.csdn.net/m0_46290969/article/details/142357711