Every day a leetcode
题目来源:2. 两数相加
解法:模拟
设置两个指针,p指向l1的头,q指向l2的头,m为p的值,n为q的值。
显然,空结点的值为0。
sum=m+n(+carry),若sum大于10,则向后进一位,否则不用。
设置一个carry,carry=sum/10,即sum的高位,sum%10是sum的低位。
新建一个链表,初始话化为空,每次得一个sum就将sum%10尾插进这个链表,若最后的carry为1,还需要插入这个1。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head=NULL;
struct ListNode* tail=NULL;
struct ListNode* p=l1;
struct ListNode* q=l2;
struct ListNode* node;
int sum;
int carry=0;
int m,n;
while(p || q || carry)
{
if(p) m=p->val;
else m=0;
if(q) n=q->val;
else n=0;
sum=m+n+carry;
carry=sum/10;
node=malloc(sizeof(struct ListNode));
if(head == NULL)
{
head=tail=node;
tail->val=sum%10;
tail->next=NULL;
}
else
{
tail->next=node;
tail=tail->next;
tail->val=sum%10;
tail->next=NULL;
}
if(p) p=p->next;
if(q) q=q->next;
}
return head;
}
结果:
三分钟就想到了,但写了好久。。。