LeetCode - 2.两数相加
题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
分析
这个题主要分析出什么情况下需要增加一个节点,在链表1不为空,链表2为空时,需要创建一个新的节点,来承接链表1多出来的一位以及上一次循环进位的和;同理,链表2不为空,链表1为空,需要创建一个新的节点,来承接链表2多出来的一位以及上一次循环进位的和;还有,链表1与链表2都为空了,但是上一次循环有进位,需要创建一个新的节点来承接进位数据。这三种情况下需要创建新节点。直到两个链表都为空停止循环,返回链表头部。
题目不是很难,不过也被卡住了,心疼自己。。。
出现了如下错误
member access within misaligned address 0x000000000031 for type 'struct ListNode', which requires 8 byte alignment
原因最后返回的指针没有指向NULL,所以最后一定要加上
lr->next = NULL;
题解
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* l1node = l1;
struct ListNode* l2node = l2;
//创建新的链表来表示求和
struct ListNode* lr = (struct ListNode*)malloc(sizeof(struct ListNode));
lr->val = 0;
lr->next = NULL;
//存储头部节点
struct ListNode* rlr = lr;
while(l1node!=NULL||l2node!=NULL){
int l1val = 0;
int l2val = 0;
l1val = l1node == NULL ? 0 : l1node->val;
l2val = l2node == NULL ? 0 : l2node->val;
//对应位求和同时加上进位
int sum = lr->val + l1val + l2val;
lr->val = sum%10;
if(l1node!= NULL){
l1node = l1node->next;
}
if(l2node!= NULL){
l2node = l2node->next;
}
struct ListNode* nl = (struct ListNode*)malloc(sizeof(struct ListNode));
//进位
nl->val = sum/10;
//三种情况
if(l1node != NULL || l2node != NULL || sum/10 != 0){
lr->next = nl;
lr = lr->next;
}
}
//不能或略最终指向为空
lr->next = NULL;
return rlr;
}
多喷喷才能有长进啊,希望各位不要留情面,使劲怼我这乱七八糟的代码。
补上之前的不足,静下心来,积少成多,希望在大家的监督下,变得更强