【刷题笔记】LeetCode_02:两数相加_中等(C)

题目:两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

第一次刷LeetCode,写一写笔记以后看哈哈哈哈。
这个题感觉基本思路很容易,就是新建结点然后构建出一个链表,但是细节有很多坑的(当然主要原因是我实在太菜了)。

  1. 它的位数是逆序,结果也是逆序,最开始我是按正常顺序相加,即“2+5”,“4+6”这样,然后存进一个数组里,构建链表时候逆序遍历数组(真的很蠢,因为这样变成正序输出了),但是我并没有考虑位数不同的情况,而且很奇怪的是用例“0 0”运行结果死活是1???不懂为什么。
    最后发现其实输入逆序输出也是逆序,即“2”和“5”都是个位数,可以直接相加,然后构建链表就可以了,因为输出也是“7”在第一位。
  2. 如果某个位置数字相加大于等于10,就需要下一位进位,那么应该是下一轮循环的时候才加,这个刚开始我也没控制好,写了很多无用代码。后来看大神的代码,发现很简单,先将这一轮的sum计算出来,然后通过控制进位的变量就可以,不过每轮循环都要刷新进位变量。
  3. 构建链表的方法:尾插法,很简洁。大神厉害呜呜呜呜呜,大神好多!
  4. 如果有一个链表先结束,那么就直接把没结束的那个长一点的链表接上。即如果p1先结束,则p1 = p2,遍历p1,即遍历未结束的p2。如果p2先结束,则p1 = p1就好了。
  5. 位数比较多的话,可能出现好多个位数的sum都大于等于10,其实只需要每轮刷新go(进位)变量,然后这一轮的sum提前用:p1->val + p2->val + go算好就OK。
  6. 到最后一个非空链表结束后,可能还有进位,也就是这个用例的情况:9342+665 =10007,输入的是2439和566,到最后还有进位,那就循环结束判断go是否为1,若是新建一个结点,val为1,然后尾插法。
  7. 最后最后就是全部结束的尾指针的next一定要置空!一定要tail->next=NULL!!因为结构里定义了ListNode*里包含一个next的指针,如果tail的next不赋值会报错,计算机不知道next指向哪里!!还有!!!临时头结点要释放!!
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){

    struct ListNode *tail;
    struct ListNode *head;
    struct ListNode *temp;
    struct ListNode *p1;
    struct ListNode *p2;
    int sum = 0;
	int go = 0;//进位判断标志 

   	head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    tail = head;//临时空的头结点
    
    p1 = l1;
    p2 = l2;

    while(p1 && p2)
    {
        sum = p1->val + p2->val + go;
        if(sum >=10)
        {
        	sum = sum % 10;
        	go = 1;
		}
		else go = 0;
		
		//尾插法 
		tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
		tail = tail->next;
		tail->val = sum;
        
        p1 = p1->next;
        p2 = p2->next;
    }
    if(p1 == NULL) //l2是长一些的 
    {
    	p1 = p2;		
	}
   	else
   	{
   		p1 = p1;
	}
   	while(p1)
   	{
   		sum = p1->val + go;
   		if(sum >= 10)
   		{
   			sum = sum % 10;
   			go = 1;
		}
		else go = 0;
		
		tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
		tail = tail->next;
		tail->val = sum;
		
		p1 = p1->next;
	}
	
	if(go == 1)
	{
		tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
		tail = tail->next;
		tail->val = 1;
	}
	
	tail->next = NULL;//tail的next要置空!! 
	
	temp = head;
	head = head->next;
	free(temp);

return head;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值