一、绪
二、两数相加
链接: 两数相加.
(一)题目描述
解释:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [2,4,3], l2 = [5,6]
输出:[7,0,4]
解释:342 + 65 = 407.
输入:l1 = [9,9,9], l2 = [1,1]
输出:[0,1,0,1]
解释:999 + 11 = 1010.
解题思路:
//1.先定义一个结果链表,初始化后,定义一个链表节点p,去遍历结果链表
//2.定义链表节点*p1、*p2去分别遍历两个链表,将两个链表对应地逐个节点值相加
//问题:如果链表中其中一个链表提前遍历到尾端,怎么办?
//应对方法:定义整型v1、v2去接收节点值,当链表走到尾端时,则节点为空,此时对应的v1或v2则赋值为0
//定义一个进位值jinWei,若两个节点值之和大于10,jinWei=1,否则等于0
//3.当两个链表都遍历完成后,判断最后一位有无进位,有则将结果链表最后一位进行赋值,无则将最后一位设为空。
//注意:不能直接将最后一个节点赋为NULL,因为末节点的前一个节点(pre)的next指针依旧指着末节点,必须将末节点(pre)的前一个节点的next指针赋为NULL才可。
//4.相加结束后,将结果链表return
(二)AC代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
//1.先定义一个结果链表,初始化后,定义一个链表节点p,去遍历结果链表
struct ListNode *result,*p;
result = p = (struct ListNode*)malloc(sizeof(struct ListNode));
result->next = NULL;
p=result;
//2.定义链表节点*p1、*p2去分别遍历两个链表,将两个链表对应地逐个节点值相加
//问题:如果链表中其中一个链表提前遍历到尾端,怎么办?
//应对方法:定义整型v1、v2去接收节点值,当链表走到尾端时,则节点为空,此时对应的v1或v2则赋值为0
//定义一个进位值jinWei,若两个节点值之和大于10,jinWei=1,否则等于0。初始为0
struct ListNode *p1,*p2,*pre;
int v1,v2,sum,jinWei=0;
p1 = p2 = pre = (struct ListNode*)malloc(sizeof(struct ListNode));
p1 = l1;
p2 = l2;
while(p1||p2){
//获取两个链表的节点值
if(p1) v1 = p1->val;
else v1 = 0;
if(p2) v2 = p2->val;
else v2 = 0;
//开始相加,并处理进位问题
sum = v1+v2+jinWei; //要记得加进位值
if(sum>=10){ //若相加和大于10,则进位
sum -= 10;
jinWei = 1;
}
else{ //否则无
jinWei = 0;
}
p->val = sum; //给结果链表节点赋值
//往结果链表下一位遍历
//注意,如果两条相加的链表均遍历到了最后一位,这里最后会留下一个末尾空结点,需要在循环外作处理,或则放最后一位的进位,或设为NULL
p->next = (struct ListNode*)malloc(sizeof(struct ListNode));
pre = p;
p = p->next;
p->next = NULL;
//往两条链表的下一位遍历
if(p1) p1=p1->next;
if(p2) p2=p2->next;
}
//判断最后一位有无进位,有则对最后一位进行赋值,无则把上面末尾剩余的一个空结点的前一个节点的next指针设为NULL
if(jinWei==1){
p->val = jinWei;
}
else pre->next = NULL;
return result;
}