- 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
/*
Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
*/
struct ListNode jinwei;//用于最后进位,添加一个节点struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {int a=0;struct ListNode *p1,*p2;p1=l1;p2=l2;while(p1->next!=NULL&&p2->next!=NULL){if(a){p1->val=p1->val+p2->val+a;a=0;if(p1->val>=10){p1->val=p1->val%10;a=1;}p2->val=p1->val;p1=p1->next;p2=p2->next;continue;}p1->val=p1->val+p2->val;if(p1->val>=10){p1->val=p1->val%10;a=1;}p2->val=p1->val;p1=p1->next;p2=p2->next;}if(p1->next==NULL&&p2->next!=NULL){p2->val=p1->val+p2->val+a;if(p2->val>=10){p2->val=p2->val%10;a=1;}else{a=0;}p2=p2->next;while(a){p2->val=p2->val+a;if(p2->val>=10){p2->val=p2->val%10;a=1;}else{a=0;}if(p2->next!=NULL){p2=p2->next;}else{if(a){p2->next=&jinwei;jinwei.val=1;jinwei.next=NULL;a=0;}}}return l2;}else if(p2->next==NULL&&p1->next!=NULL){p1->val=p2->val+p1->val+a;if(p1->val>=10){p1->val=p1->val%10;a=1;}else{a=0;}p1=p1->next;while(a){p1->val=p1->val+a;if(p1->val>=10){p1->val=p1->val%10;a=1;}else {a=0;}if(p1->next!=NULL){p1=p1->next;}else{if(a){p1->next=&jinwei;jinwei.val=1;jinwei.next=NULL;a=0;}}}return l1;}else{p1->val=p2->val+p1->val+a;if(p1->val>=10){p1->val=p1->val%10;a=1;}else{a=0;}if(a){p1->next=&jinwei;jinwei.val=1;}return l1;}}
思路:
1.遍历两个链表,某个链表遍历完毕前对两个链表按节点相加,结果同时放入两个链表里
2.某个链表为空,进行分类讨论
3.同时为空时,判断是否进位,不进位直接返回一个链表,进位则加一个进位的节点后再返回
4.某一个为空时,判断不空的链表加上个节点的进位是否需要继续进位,若需要则继续运算进位+较长链表的进位节点,直到不需要进位为止。
此时可能出现两种情况:
①长链表遍历前就不用进位或遍历完毕最后一个节点不需要进位,此时直接返回长链表
②长链表遍历完毕仍需要进位,添加一个节点,之后返回链表