0、题目链接
1、题目分析
难度中等7007
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
2.变量设置 及其基本数据类型分析
这个题就是给出两个链表,长度至少为1,链表每个节点内的值 至少为0
求两个链表相加之后的和
也就是如题
9 9 9 9 9 9 9
9 9 9 9
8 9 9 9 0 0 0 1对应
分析不难发现 其实这个题就是小学算术题里的
9 9 9 9 9 9 9
+ 9 9 9 9
————————
1 0 0 0 9 9 9 8
也就是两个数从右往左 读出来 之后相加得到的结果 再从右往左填进去 新链表
这里我觉得要开辟新链表,不然你不知道两个链表谁就比谁长了,
在原有数据结构上增删改 太麻烦了,情况多且复杂。不如开辟新链表香。
//这里的新链表开辟的很有技巧,因为众所周知,在Java中,内存分为堆内存和栈内存
其中 当 new出现时 一个ne左边的等号 ,就把栈和堆紧密的联系在一起啦~
其中学到目前有new的语句,我总结了一下:
Person person = new Person( );
int [] array = new int [1024];
HashSet<Integer> set = new HashSet<> ();
String str = new String("小红日srs");
而此处 你构造新链表 就要给他一个头结点指向它
关于头结点,我请教前阿里巴巴资深软件开发工程师 高博老师 得到的解释如上。
也就是说本题如果声明新的链表,在堆上开辟内存存这个链表。
ListNode newHead=new ListNode(-10);
ListNode temp=newHead;
这样搞是极其巧妙地,然后返回值返回newHead.next,满满都是细节。
3、循环条件,中间过程,收尾处理工作!
循环条件可以设置为 两个都不为空
while(l1!=null&&l2!=null)
{
int sum=l1.val+l2.val;
ListNode node = new ListNode(sum);
temp.next=node;
temp=temp.next;
l1=l1.next;
l2=l2.next;
}
然后在新链表中再不断地new新节点,新节点的值就是原来两个链表的值的和。
当出了循环之后,一定是三种情况:
1,单链表1走完了,2没走完
2,单链表2走完了,1没走完
3,两个单链表一起走完
3不用管,针对1和2的情况,
1走完了,把链表2剩下的接在新链表上
2走完了,把链表1同理处理!
if(l1==null)
{
temp.next=l2;
}
if(l2==null)
{
temp.next=l1;
}
ListNode cur=newHead;
处理完之后,得到的每个链表内的结点值都是小于等于18的,再对他们进行清算!~
//处理完两个链表的值合并,开始清算新链表
while(cur!=null)
{
if(cur.val>=10)
{
if(cur.next==null)
{
cur.val-=10;
ListNode nb = new ListNode(1);
cur.next=nb;
break;
}
cur.val-=10;
cur.next.val++;
}
cur=cur.next;
}
不如开辟新链表 ,其次 ,这个题的难度降低,就降低在如本题,如果有进位的话,进位肯定是最后一位为1,也就是链表最后补个1,特殊情况考虑一下即可~~
最后老铁们不要忘了返回值呀!~~`~~`
return newHead.next;
4、总结
总代码如下:
/**
* 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 newHead=new ListNode(-10);
ListNode temp=newHead;
while(l1!=null&&l2!=null)
{
int sum=l1.val+l2.val;
ListNode node = new ListNode(sum);
temp.next=node;
temp=temp.next;
l1=l1.next;
l2=l2.next;
}
if(l1==null)
{
temp.next=l2;
}
if(l2==null)
{
temp.next=l1;
}
ListNode cur=newHead;
//处理完两个链表的值合并,开始清算新链表
while(cur!=null)
{
if(cur.val>=10)
{
if(cur.next==null)
{
cur.val-=10;
ListNode nb = new ListNode(1);
cur.next=nb;
break;
}
cur.val-=10;
cur.next.val++;
}
cur=cur.next;
}
return newHead.next;
}
}
喜欢的老铁还请多多支持呀,我们共同进步,骐骥一跃,不能十步,驽马十驾,功在不舍!