LeetCode-2.两数相加 使用链表加法实现

简介: 每天刷一刷题~

先看题目

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

方案一:把链表转换为数字相加,再形成链表,这样做的问题是系统样例测试输入链表很长的时候,程序的基本类型存不下(溢出),这种方法不推荐。
方案二:链表的每个结点单独相加,如上面是2+5=7,6+4=10(这里要进一位)
直接上代码:

#include<stdio.h>
#include<stdlib.h>
struct ListNode {
    int val;
    struct ListNode *next;
};
/**
 * LeetCode
 * 2.两数相加
 * https://leetcode-cn.com/u/banana798/
 */
//添加结点
ListNode* add(ListNode*head, int temp){
    ListNode *p=head;
    while(1){
        if(p->next==NULL){
            p->next=(ListNode*)malloc(sizeof(ListNode));
            p->next->val = temp;
            p->next->next=NULL;
            return head;
        }
        p=p->next;
    }
}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *p=l1, *q=l2, *curr = head;
    //tag用以标记进位
    int tag = 0;
    while(p!=NULL||q!=NULL){
        int x = p ? p->val : 0;
        int y = q ? q->val : 0;
        int sum = tag + x + y;
        tag = sum/10;
        curr->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        curr->next->next=NULL;
        curr->next->val = sum%10;
        curr=curr->next;
        if(p) p=p->next;
        if(q) q=q->next;
    }
    //最后进1位
    if(tag>0){
        curr->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        curr->next->next=NULL;
        curr->next->val = tag;
    }
    return head->next;
}

int main(){
    struct ListNode *l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    l1->next=NULL;
    l2->next=NULL;

    //向链表添加测试数据
    add(l1,1);
    add(l2,9);

    l1=addTwoNumbers(l1->next,l2->next);
    printf("%d->%d",l1->val,l1->next->val);
}

注意:LeetCode这里没有说明链表带不带头结点,经过我的测试后发现所有样例的链表都是没有头结点的。

目录
相关文章
|
19天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
31 1
|
26天前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
44 0
Leetcode第21题(合并两个有序链表)
|
26天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
14 0
LeetCode第二十四题(两两交换链表中的节点)
|
26天前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
37 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
26天前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
69 0
|
26天前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
18 0
|
26天前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
14 0
|
26天前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
12 0
|
26天前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
28 0
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点