力扣之路02—两数相加


image

 


1
class Solution { 2 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 3 // 初始化进位0,这个变量用来记录上一位相加后有没有“满10进1”。 4 // 它的值只能是0或1 5 // 因为两个一位数加进位最大是9+9+1=19,进位最多1 6 int carry = 0; 7 8 // 创建一个用以盛放结果的链表 9 // 为避免空指针异常,也避免每次对头部元素进行判空,设置一个哑巴结点 10 // 我们要根据头部结点是否为空输入采用 .next 还是 head=newNode 11 ListNode dummy = new ListNode(0); 12 // cur 是一个指针,指向当前结果链表的最后一个节点,初始时指向哑节 13 // 点。每次添加新节点后,cur 就向后移动一位,保持指向末尾 14 // 通俗来说,1→2→3,这时cur 指向3,假如再添加一个元素9, 15 // 变成1→2→3→9,cur就指向了9,cur.next就是移向下一个结点 16 ListNode cur = dummy; 17 18 // l1 != null:l1 链表还有节点没处理 19 // l2 != null:l2 链表还有节点没处理 20 // carry != 0:虽然两个链表都走完了, 21 // 但还有进位需要额外增加一个节点 22 // 例如 5+5=10,最后要加一个值为1的新节点 23 while(l1 != null || l2 != null || carry != 0){ 24 // 初始化当前位的总和为进位值。 25 // 因为进位本来就是上一位留下的、要加到这一位上的值 26 int sum = carry; 27 28 if(l1 != null){ 29 sum += l1.val; 30 l1 = l1.next; 31 } 32 33 if(l2 != null){ 34 sum += l2.val; 35 l2 = l2.next; 36 } 37 38 // 计算进位,比如 sum=19,则19/10 = 1,进位1 39 carry = sum/10; 40 41 // 等号右边的意思是创建一个新节点 42 // 等号左边的意思是将当前最后一个结点的 next 指针指向这个新节点 43 // 从而把新节点挂到链表末尾 44 // 绳子上的每个标签:就是 ListNode 节点 45 // 每个标签背后有一个小环:这个环可以挂住下一个标签 46 // 这就是 next 47 // 你手里拿着一张“当前末尾”的指引卡:上面写着“最后一个标签在这里” 48 // 这就是 cur 指针 49 // 所以第一行代码是把新标签挂在最后一个标签那里 50 // 第二行代码是移步到被挂上的新标签上,准备为下一个要来到的标签挂上 51 cur.next = new ListNode(sum % 10); 52 cur = cur.next; 53 } 54 return dummy.next; 55 } 56 }

 

posted @ 2026-05-22 00:39  NO-PATS  阅读(11)  评论(0)    收藏  举报