0
点赞
收藏
分享

微信扫一扫

LeeCode 热题 HOT 100- 两数相加

小a草 2022-03-30 阅读 66
c++

        本题需要熟练掌握数据结构——链表。我做了好久,刚刚ac。其实大体上的代码逻辑我很快就想好了,但因为细节问题耽误了很多时间。我总结原因有两点,其一是对代码的掌握能力较差,缺少全局观,其二是粗心大意。方法比较笨,先记录下来,以后再做优化。

本题思路:定义一个保存进位数的数组,同时观察到链表节点都是个位数,即要么进 0,要么进 1 。然后用if else 语句分情况讨论。思路不难,难在细节。

        

class Solution {
public:
    
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
	
	vector<int> jinwei;   //保存每次进位的进位数  
	jinwei.push_back(0);
	vector<int> result;
	int j = 0, l = 0, i1, i2, i3, i4;
	int l1_val, l2_val;
//	l1_val = l1->val; l2_val = l2->val;
	while (l1 != NULL || l2 != NULL)           
	{
		if(l1) l1_val = l1->val; 
		if(l2) l2_val = l2->val;

		if (l1_val + l2_val + jinwei.at(l) < 10 && l1 != NULL && l2 != NULL)
		{
			j = 1;
			l = l + 1;
		}
			
		else if (l1_val + l2_val + jinwei.at(l) >= 10 && l1 != NULL && l2 != NULL)
		{
			j = 2;
			l = l + 1;
		}
			
		else if (l1 != NULL && l2 == NULL)
		{
            j = 3;
            l = l + 1;
        }	

		else if (l1 == NULL && l2 != NULL)
		{
            j = 4;
            l = l + 1;
        }	
		
		switch (j)
		{
		case 1:
			i1 = (l1_val + l2_val + jinwei.at(l - 1));
			jinwei.push_back(0);       //只能进1
			result.push_back(i1);      
			break;
		case 2:
			i2 = (l1_val + l2_val + jinwei.at(l - 1) )% 10;  //l - 1!
  			jinwei.push_back(1);      
			result.push_back(i2);      
			break;
		case 3:
			i3 = l1_val + jinwei.at(l - 1);
            if(i3 >= 10)
            {
                i3 = (l1_val + jinwei.at(l - 1)) % 10;
                jinwei.push_back(1);
			    result.push_back(i3);
            }
            else
            {
                jinwei.push_back(0);
			    result.push_back(i3);
            }
			
			break;
		case 4:
			i4 = l2_val + jinwei.at(l - 1);
			if(i4 >= 10)
            {
                i4 = (l2_val + jinwei.at(l - 1)) % 10;
                jinwei.push_back(1);
			    result.push_back(i4);
            }
            else
            {
                jinwei.push_back(0);
			    result.push_back(i4);
            }
			break;
		}
		
		if (l1) l1 = l1->next; 
		if (l2) l2 = l2->next;
    }
	if(jinwei.at(jinwei.size() - 1) != 0)
        result.push_back(jinwei.at(jinwei.size() - 1));


	return creat(result);
    }



    ListNode* creat(vector<int> v)
    {
        ListNode* P = new ListNode(v[0]);
        ListNode* T = P;
		int j = v.size();
		for (int i = 1; i < j; i++)
		{
		    ListNode* L = new ListNode(v[i]);
			T->next = L;
			T = T->next;
		}
        return P;

    }
};

再来说说我写题时遇到的坎儿吧。1. while的循环条件 2.vector<int> jinwei 下标的移动  3.case 3, case 4 考虑情况不全

        方法比较笨,以后再看时我会做优化。

举报

相关推荐

0 条评论