LeetCode:Add Two Numbers

本文分享了一种解决两个链表表示的大数相加的方法,通过遍历链表并处理进位,最终得到新的链表表示的结果。文章还讨论了在实现过程中遇到的一些常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题可以说是花了我很久的一道题,说实话感觉以前链表知识学得很好,但是实际动手起来就会发现其实自己有很多问题不懂。比如链表指针再动的时候,没有加另外再赋值一个头指针,不这样在单链表里就没办法找到原来的头指针。再比如,用pushBack方法压入数据是,链表的指针应该再移一位。作为一个大三的学生了,现在才会利用好链表觉得还是满惭愧的。

这道题我本来是想把l1和l2的数据先表示出来再求和,再把和存到链表里,发现和一旦很大以后就会出现莫名其妙的结果,看来用链表存储大数据是有道理的!

最近没有更新,是我弟弟来武汉看樱花了,据说今天来武大看樱花的人数过10万了,唉真心伤不起。每天看到学校人多暴了,都不太想出门了。

还是要好好学好数据结构和算法,最近越来越有这种感触了。

/**
 * 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) {
        if(l1==NULL)return l2;
        if(l2==NULL)return l1;
        int flag=0;//进位标志 
        int sum=0;
        int current=0;
        int quo=0;
		int tmp; 
        ListNode *l3=NULL;
        ListNode *ans=NULL;
    	while(l1!=NULL&&l2!=NULL){      //l1,l2链表均不为空 
    		tmp=l1->val+l2->val+ flag;
    		flag=tmp/10;
    		current=tmp%10;
    		if(l3==NULL){          //l3为空时赋初值 
    			l3=new ListNode(current);
    			ans=l3;
    		}
    		else{
    			l3=pushBack(l3,current); //不空,L3压入currenr,!!且l3指向下一节点!! 
    		}
    		l1=l1->next;
    		l2=l2->next;
    	}
    	while(l1!=NULL){     //l2为空l1不为空 
    		tmp=l1->val+ flag;
    		flag=tmp/10;
    		current=tmp%10;
    		l3=pushBack(l3,current);
    		l1=l1->next;
    	} 
    	while(l2!=NULL){
    		tmp=l2->val+ flag;
    		flag=tmp/10;
    		current=tmp%10;
    		l3=pushBack(l3,current);
    		l2=l2->next;
    	} 	
    	if(l1==NULL&&l2==NULL&&flag==1)   //若两者之和还有进位 
		l3=pushBack(l3,1);
			
    	return ans;
    }


ListNode * pushBack(ListNode * last, int val) {  //模拟C++的pushBack方法 
    ListNode * l = new ListNode(val);
    last->next = l;
    return l;
  }
};

/*int main(){
	ListNode *l2=new ListNode(1);
	 ListNode * l = new ListNode(9);
    l2->next = l;
    ListNode * l4 = new ListNode(9);
    l->next = l4;
	ListNode * l5 = new ListNode(9);
    l4->next = l5;
	ListNode * l6 = new ListNode(9);
    l5->next = l6;
	ListNode * l7 = new ListNode(9);
    l6->next = l7;
    ListNode * l8 = new ListNode(9);
    l7->next = l8;
    ListNode * l9 = new ListNode(9);
    l8->next = l9;
    ListNode * l20 = new ListNode(9);
    l9->next = l20;
    ListNode * l21 = new ListNode(9);
    l20->next = l21;
    ListNode * l22 = new ListNode(9);
    l21->next = l22;
	ListNode *l1=new ListNode(9);
	Solution Test;
	ListNode *l3=Test.addTwoNumbers(l1,l2);
	while(l3!=NULL){
	cout<<l3->val;
	l3=l3->next;
	
}
	return 0;
}*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值