### 思路
- 标签:链表
- 将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 $0$,比如 `987 + 23 = 987 + 023 = 1010`\n- 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
- 如果两个链表全部遍历完毕后,进位值为 $1$,则在新链表最前方添加节点 $1$\n- 小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点 head。**使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。**\n
### 代码
```Java []\n/**\n * Definition for singly-linked list.\n * public class ListNode {\n * int val;\n * ListNode next;\n * ListNode(int x) { val = x; }\n * }\n */\nclass Solution {\n public ListNode addTwoNumbers(ListNode l1, ListNode l2) {\n ListNode pre = new ListNode(0);\n ListNode cur = pre;\n int carry = 0;\n while(l1 != null || l2 != null) {\n int x = l1 == null ? 0 : l1.val;\n int y = l2 == null ? 0 : l2.val;\n int sum = x + y + carry;\n
carry = sum / 10;\n sum = sum % 10;\n cur.next = new ListNode(sum);\n
cur = cur.next;\n if(l1 != null)\n l1 = l1.next;\n if(l2 != null)\n l2 = l2.next;\n }\n if(carry == 1) {\n cur.next = new ListNode(carry);\n }\n return pre.next;\n }\n}\n```\n
### 画解
<,,,,,,,,>\n\n想看大鹏画解更多高频面试题,欢迎阅读大鹏的 LeetBook:[《画解剑指 Offer 》](https://leetcode-cn.com/leetbook/detail/illustrate-lcof/),O(∩_∩)O