分析:求两个链表相加的和,运算从低到高,即从头节点开始向后运算。所需考虑的是当前两个链表是否已经遍历完成,以及当前是否需要进位。
步骤:
- 1.设置两个指针分别指向l1和l2的头节点
2.开一个新链表,维护一个指向新链表的尾指针
3.插入节点:- a.从l1和l2中选出两个节点
-b.算出当前节点的值
-c.判断是否需要进位(当前节点是否大于10)
-d.建立节点,连接到新链表中
- a.从l1和l2中选出两个节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
//设置哨兵prehead
struct ListNode* prehead=(struct ListNode*)malloc(sizeof(struct ListNode));
prehead->val=0;
prehead->next=NULL;
//维护指向新链表的尾指针
struct ListNode* tail=prehead;
//carry表示前一次相加后是否进位,大于10,carry为1,小于10为0,
int carry=0;
//l1和l2不为空,且无需进位,跳出循环
while(l1||l2||carry){
//在l1链表中选择一个值
int nl1=(l1)?l1->val:0;
//在l2链表中选值
int nl2=(l2)?l2->val:0;
//当前的和为l1和l2的值再加上carry
int sum=nl1+nl2+carry;
//是否大于10,大于0,则需要进位
carry=sum/10;
//当前节点的值
int val=sum%10;
struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode));
node->val=val;
node->next=NULL;
tail->next=node;
tail=node;
//防止l1和l2为空指针
if(l1)
l1=l1->next;
if(l2)
l2=l2->next;
}
l1=prehead->next;
free(prehead);
return l1;
}