今日刷letcode的感悟:先把现实中的思路写好,比如说这个题目的加法,通过,语言的语法,解题的经验,用示例丰富细节,完成解题。
解法:1互换链表,那个长就作为主链表,把两链表的和存到主链表上。
当短链表长度不够时就赋值为null,并将它节点的值赋值为零。
加法部分,两数之和与进位符相加,大于等于10要进位,使得进位符+1,不大于等于10就要使进位符等于0;将和取余(用%),余数放到主链表节点上。
当主链表节点遍历完后,判断进位符,若进位符等于1,则新建节点,并将尾节点的next指向新节点ListNode。
程序结果返回头节点。
代码:
/**
* 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 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l=null;
ListNode tail=null;
ListNode head=null;
int caryy=0;
int k=0;
if(length(l1)<length(l2)){
l=l2;
l2=l1;
l1=l;//如果l1的长度比l2短就互换。
}
head=l1;
while(l1!=null){
if(l2==null){
k=0;
}else{
k=l2.val;
}
int len = l1.val+k+caryy;
l1.val=len%10;
if(len>9){
caryy=1;
}else{
caryy=0;
}
tail=l1;
l1=l1.next;
if(l2!=null){
l2=l2.next;
}else{
l2=null;
}
}
if(caryy==1){
tail.next=new ListNode(1);
return head;
}else{
return head;
}
}
public int length(ListNode l){
int c=0;
while(l!=null){
l=l.next;
c++;
}
return c;
}
}