知识点
操作链表节点;怎么创建一个新链表;怎么申请一个新节点;
还是 本无链表,节点申请多了,就成了链表了;
解题思路
法一:将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位):
获取两个链表所对应的长度
在较短的链表末尾补零
对齐相加考虑进位
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1=1;//记录l1的长度
int len2=1;//记录l2的长度
ListNode* p=l1;
ListNode* q=l2;
while(p->next!=NULL)//获取l1的长度
{
len1++;
p=p->next;
}
while(q->next!=NULL)//获取l2的长度
{
len2++;
q=q->next;
}
if(len1>len2)//l1较长,在l2末尾补零
{
for(int i=1;i<=len1-len2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else//l2较长,在l1末尾补零
{
for(int i=1;i<=len2-len1;i++)
{
p->next=new ListNode(0);
p=p->next;
}
}
p=l1;
q=l2;
bool count=false;//记录进位
ListNode* l3=new ListNode(-1);//存放结果的链表
ListNode* w=l3;//l3的移动指针
int i=0;//记录相加结果
while(p!=NULL&&q!=NULL)
{
i=count+p->val+q->val;
w->next=new ListNode(i%10);
count=i>=10?true:false;
w=w->next;
p=p->next;
q=q->next;
}
if(count)//若最后还有进位
{
w->next=new ListNode(1);
w=w->next;
}
return l3->next;
}
};
法二:不对齐补零,若链表不为空则用sum(代表每个位的和的结果)加上,考虑进位。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head=new ListNode(-1);//存放结果的链表
ListNode* h=head;//移动指针
int sum=0;//每个位的加和结果
bool carry=false;//进位标志
while(l1!=NULL||l2!=NULL)
{
sum=0;
if(l1!=NULL)
{
sum+=l1->val;
l1=l1->next;
}
if(l2!=NULL)
{
sum+=l2->val;
l2=l2->next;
}
if(carry)
sum++;
h->next=new ListNode(sum%10);
h=h->next;
carry=sum>=10?true:false;
}
if(carry)
{
h->next=new ListNode(1);
}
return head->next;
}
};
代码实现
自己写的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* }; 增删改查四大要素
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result =new ListNode(-1); //存放结果的链表,-1就是个赋初始值而已
ListNode* v = result;
ListNode* p =l1;
ListNode* q =l2;
int len1=1; // 进行计算链表的长度
int len2=1;
int sum ;// 记录之和
int i=0;
// 进行将少的那一个链表进行补齐;
if(p==NULL){
return l2;
}
if(q==NULL){
return l1;
}
// 获取长度
while(p->next!=NULL){
len1++;
p=p->next; // 最后一个节点的地址
}
while(q->next!=NULL){
len2++;
q=q->next;
}
// 开始补齐
if(len1<len2){
for(i=0;i<(len2-len1);i++){
p->next=new ListNode(0);
p=p->next;
}
}
else{
for(i=0;i<(len1-len2);i++){
q->next=new ListNode(0);
q=q->next;
}
}
// 初始化列表
p=l1; // 这就是为什么没有直接使用l1的原因,否则的话找不到首地址了
q=l2;
int flag=0;
while(p!=NULL&&q!=NULL){
sum = p->val+q->val+flag;
v->next=new ListNode(sum%10);
if(sum>=10){
flag=1;
}
else{
flag=0;
}
p=p->next;
q=q->next;
v=v->next;
}
if(flag==1){
v->next==new ListNode(1);
v=v->next; // 这个地方必须加上,否则的话最后一个节点没有加上去
}
return result->next;
}
};
不敢拖延了,不要自己总是想的自我感动自我美好了,没有规矩就是不成方圆,定好的计划就是一个承诺,不达成就别睡觉,熬夜掉头发也得上