@@ -47,46 +47,39 @@ JavaScript:
4747 * @return {ListNode}
4848 */
4949var addTwoNumbers = function (l1 , l2 ) {
50- var carried = 0 ; // 用于进位
51- const head = new ListNode ();
52- const noop = {
53- val: 0 ,
54- next: null
55- };
56- let currentL1 = l1;
57- let currentL2 = l2;
58- let currentNode = head; // 返回的链表的当前node
59- let newNode; // 声明在外面节省内存
60- let previousNode; // 记录前一个节点,便于删除最后一个节点
61-
62- while (currentL1 || currentL2) {
63- newNode = new ListNode (0 );
64-
65- currentNode .val =
66- ((currentL1 || noop).val + (currentL2 || noop).val + carried) % 10 ;
67-
68- currentNode .next = newNode;
69- previousNode = currentNode;
70- currentNode = newNode;
71-
72- if ((currentL1 || noop).val + (currentL2 || noop).val + carried >= 10 ) {
73- carried = 1 ;
74- } else {
75- carried = 0 ;
50+ if (l1 === null || l2 === null ) return null
51+
52+ // 使用dummyHead可以简化对链表的处理,dummyHead.next指向新链表
53+ let dummyHead = new ListNode (0 )
54+ let cur1 = l1
55+ let cur2 = l2
56+ let cur = dummyHead // cur用于计算新链表
57+ let carry = 0 // 进位标志
58+
59+ while (cur1 !== null || cur2 !== null ) {
60+ let val1 = cur1 !== null ? cur1 .val : 0
61+ let val2 = cur2 !== null ? cur2 .val : 0
62+ let sum = val1 + val2 + carry
63+ let newNode = new ListNode (sum % 10 ) // sum%10取模结果范围为0~9,即为当前节点的值
64+ carry = sum >= 10 ? 1 : 0 // sum>=10,carry=1,表示有进位
65+ cur .next = newNode
66+ cur = cur .next
67+
68+ if (cur1 !== null ) {
69+ cur1 = cur1 .next
7670 }
7771
78- currentL1 = (currentL1 || noop).next ;
79- currentL2 = (currentL2 || noop).next ;
72+ if (cur2 !== null ) {
73+ cur2 = cur2 .next
74+ }
8075 }
8176
82- if (carried) {
83- // 还有位没进呢
84- previousNode .next = new ListNode (carried)
85- } else {
86- previousNode .next = null ;
77+ if (carry > 0 ) {
78+ // 如果最后还有进位,新加一个节点
79+ cur .next = new ListNode (carry)
8780 }
8881
89- return head;
82+ return dummyHead . next
9083};
9184```
9285C++
0 commit comments