我们首先创建一个虚拟头节点dummy
,它的主要作用是简化边界条件的处理。然后,我们使用一个循环来遍历两个链表,同时考虑进位。在循环中,我们计算当前位的和(包括从上一个计算中可能遗留下来的进位),然后更新进位和当前节点。如果两个链表中的某个链表已经遍历完,我们将对应的值视为0。最后,我们返回虚拟头节点的下一个节点,它实际上是结果链表的头节点
代码如下:
public class addNumber {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummy=new ListNode(0);//创建一个虚拟头节点ListNode cur=dummy; //当前操作节点初始化为虚拟头节点int carry=0; //进位初始化为0while(l1!=null || l2!=null||carry>0){int x=l1!=null?l1.val:0;// 如果l1不为空则取l1的值否则取0int 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;