LeetCode0002-链表相加
//给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
//
//请你将两个数相加,并以相同形式返回一个表示和的链表。
//
//你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
//
//来源:力扣(LeetCode)
//链接:https://leetcode-cn.com/problems/add-two-numbers
package codepackage; //重点在:新建一个链表时,要用一个指针来固定表示新链表的头地址,用第二个指针来进行链表的延长 //重点二:对链表为空时的判断,如果 while循环里的条件为 A!=NULL || B!==NULL,则内部需要对单独为空的情况做单独处理,避免空指针 //重点三:最后一位有进位时,需要单独处理!否则就少一位 public class Num002_addTwoNumbers { public static ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry =0; ListNode sum = new ListNode(); // 第一个指针固定链表头部,避免头部地址消失 ListNode result=sum; while(l1 != null || l2!=null){ ListNode two = new ListNode(); if(l1 == null){ two.val=(l2.val+carry)%10; carry = (l2.val+carry)/10; }else if(l2==null){ two.val=(l1.val+carry)%10; carry = (l1.val+carry)/10; }else{ two.val = (l1.val+l2.val+carry)%10; carry=(l1.val+l2.val+carry)/10;} sum.next=two; // 第二个指针用于延长链表 sum = sum.next; if(l1!=null)l1=l1.next; if(l2!=null)l2=l2.next; } if(carry >0){ ListNode two1 = new ListNode(); two1.val=1; sum.next=two1; } return result.next; } // 优化非空的写法,减少代码量 public static ListNode addTwoNumbers2(ListNode l1, ListNode l2) { int carry =0; ListNode sum = new ListNode(); ListNode result=sum; while(l1 != null || l2!=null){ ListNode two = new ListNode(); // // 优化判断,如果l1==null时,这样依然不可以,还是会报错空指针 // l1.val = l1==null? 0:l1.val; // l2.val = l2 == null? 0:l2.val; // 这样就是最好了 int x = l1==null? 0:l1.val; int y = l2 == null? 0:l2.val; two.val = (x+y+carry)%10; carry=(x+y+carry)/10; sum.next=two; // 第二个指针用于延长链表 sum = sum.next; if(l1!=null)l1=l1.next; if(l2!=null)l2=l2.next; } if(carry >0){ ListNode two1 = new ListNode(); two1.val=1; sum.next=two1; } return result.next; } public static void main(String[] args) { ListNode l1=new ListNode(2); l1.next = new ListNode(4); l1.next.next = new ListNode(3); ListNode l2=new ListNode(5); l2.next = new ListNode(6); l2.next.next = new ListNode(4); ListNode result = addTwoNumbers(l1,l2); System.out.println(result); System.out.println(10%10); } }