【Leetcode两数相加】

Leetcode第二题(两数相加):

求两数之和:传入两个链表,求其和并以链表返回


算法思路:

要点在于判断两个链表的长度问题和高位进位问题
首先遍历两个链表判断其长度谁大,然后将尾指针记录下来。然后同时遍历两个数组,进行数据求和,将得到数据放入较长的链表。
最后输出时考虑最高位进位,利用之前保存的尾指针在长链表末尾追加一个为值为一的节点。

代码

注意链表长度判断和进位问题。

 /* Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int sum = 0,jin = 0;            
        int len1 = 0 ,len2 = 0;
        ListNode * ret1 = l1,* ret2 = l2;   //用于返回链表
        while(l1->next!=nullptr)	        //遍历两个链表求长度
        {
            l1=l1->next;
            len1++;
        }
        while(l2->next!=nullptr)
        {
            l2=l2->next;
            len2++;
        }
        ListNode * end1 = l1,* end2 = l2;	//记录链表结尾
        l1 = ret1;                       	//指针回到头节点
        l2=ret2;
        bool FirstBigger = (len1>=len2);	//判断两个链表大小,第一个大则FirstBigger = ture 
        while( l1 || l2 )					//主循环同时遍历两个链表
        {
            int n1 = l1 ? l1->val : 0;		//l1不为空就取值,为空就取 0 
            int n2 = l2 ? l2->val : 0;
            sum = n1 + n2 + jin;			//记录和
            if(FirstBigger)					//第一个链表长就将值存在第一条链表
            {
                l1->val = sum%10;                
            }
            else 
            {
                l2->val = sum%10;  
            }
            if(l1)						   
            {
                l1 = l1->next;
            }
            if(l2)
            {
                l2 = l2->next;             
            }
            jin = sum/10;				//取进位
        }
        if(jin)							//有进位则返回时在尾部追加一个值为1的节点
        {
            if(FirstBigger)
            {
                l2 = new ListNode (1,nullptr);       //用l2为了省空间
                end1->next = l2;
                return ret1;
            }
            else
            {
                l1 = new ListNode (1,nullptr);  
                end2->next = l1;     
                return ret2;
            }
        }
        return (FirstBigger ? ret1 :ret2);			//无进位直接返回较长的链表
    }
};

TIPS:

可直接用链表指针判断链表是否为空
n1 = l1 ? l1->val : 0;三目运算符用于取值,补全短链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值