马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
解法都在代码里,不懂就留言或者私信
理论上提交这个就是最优解
字节考过不下20次,这个高居字节口试榜第9名
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- class Solution {
- /**本题从头到尾相加,还算比较简单,就每一位相加,算出进位值然后给下一位
- 每一位都这么加,直到某个位不再有数停止遍历,如果有某个还不为空,就继续遍历这一个链表
- 最后如果有进位,单独出一位(如果有就是1,这是常识) */
- public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
- /**和一个空的数相加相当于加了0,返回自己即可 */
- if(l1 == null || l2 == null) {
- return l1 == null? l2 : l1;
- }
- /**carry表示进位,整个计算过程中我们就用这一个进位变量*/
- int carry = 0;
- /**head是整个结果链表的头节点 */
- ListNode head = null;
- ListNode lastConnect = null;
- while(l1 != null && l2 != null) {
- /**毛和(进位之前的) */
- int grossSum = l1.val + l2.val + carry;
- /**当前位进位之后的值*/
- int curNum = grossSum % 10;
- /**进位 */
- carry = grossSum / 10;
- ListNode cur = new ListNode(curNum);
- /**如果这是结果的第一个节点,把它设置为头和最后一个被连上的节点 */
- if(head == null) {
- head = cur;
- lastConnect = cur;
- } else {
- lastConnect.next = cur;
- lastConnect = cur;
- }
- /**当前处理完毕,都跳下一个 */
- l1 = l1.next;
- l2 = l2.next;
- }
- while(l1 != null) {
- /**如果链表1还没有用完,那就继续计算它和进位 */
- int grossSum = l1.val + carry;
- int curNum = grossSum % 10;
- carry = grossSum / 10;
- ListNode cur = new ListNode(curNum);
- /**这个时候不会出现结果链表还没初始化的情况,不用判断head是不是为null*/
- lastConnect.next = cur;
- lastConnect = cur;
- l1 = l1.next;
- }
- while(l2 != null) {
- /**如果链表1还没有用完,那就继续计算它和进位 */
- int grossSum = l2.val + carry;
- int curNum = grossSum % 10;
- carry = grossSum / 10;
- ListNode cur = new ListNode(curNum);
- /**这个时候不会出现结果链表还没初始化的情况,不用判断head是不是为null*/
- lastConnect.next = cur;
- lastConnect = cur;
- l2 = l2.next;
- }
- /**如果最后还有进位,那就进位作为最后一个节点 */
- if(carry != 0) {
- ListNode carryNode = new ListNode(carry);
- lastConnect.next = carryNode;
- }
- return head;
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |