1. 程式人生 > 遊戲攻略 >《原神攻略》無盡驟戰2000分思路分享

《原神攻略》無盡驟戰2000分思路分享

兩數相加

問題描述:

給你兩個非空連結串列,表示兩個非負整數。他們的每位數字都是按照逆序方式儲存,且每個節點只能儲存一位數。

請你將兩個數相加,並以相同形式返回一個表示和的連結串列。

![img](file:///C:\Users\86130\Documents\Tencent Files\2909692915\Image\C2C\HGPQS%6S5LZIBU6]$E@[email protected])

輸入:L1 = [2,4,3],L2 = [5.6.4]

輸出:[7,0,8]

解釋:342 + 465 = 807

程式碼實現(C++)

#include<iostream>
#include<list>
#include<iterator>
using namespace std;


class solution
{
public:
	void input();//輸入數字,存入連結串列
	void polishing();//補齊連結串列
	void count();//求和
	void output();//輸出結果

private:
	int size1;//連結串列L1的節點
	int size2;//連結串列L2的節點
	list<int> L1;//L1存放的資料型別是int型
	list<int> L2;
	list<int> result;//結果連結串列存放的資料型別是int
};

//輸入
void solution::input()
{
	int input1;
	int input2;

	cin>>size1;
	for(int i = 0;i < size1;i++)
	{
		cin>>input1;
		L1.push_back(input1);//push_back:將input1加到L1當前最後一個元素的下一個元素
	}

	cin>>size2;
	for(int i = 0;i < size2;i++)
	{
		cin>>input2;
		L2.push_back(input2);
	}
}

//補齊連結串列
void solution::polishing()
{
	int temp;

	//L1比L2長,在L2後面補0
	if(L1.size() > L2.size())
	{
		temp = L1.size() - L2.size();

		for(int i = 0;i < temp;i++)
		{
			L2.push_back(0);
		}
	}
	

	//L2比L1長,在L1後面補0
	if(L1.size() < L2.size())
	{
		temp = L2.size() - L1.size();
		for(int i = 0;i < temp;i++)
		{
			L1.push_back(0);
		}
	}
}

//求和
void solution::count()
{
	int temp2;
	int add=0;//進位

	////iterator:檢查容器內元素並遍歷元素的資料型別
	list<int>::iterator  iter1 = L1.begin();//.begin();返回指向容器 最開始位置資料的指標
	list<int>::iterator  iter2 = L2.begin();

	for(; iter1 != L1.end(); iter1++)//.end();返回指向容器最後一個數據單元+1的指標
	{
		//進位
		if( (*iter1) + (*iter2) + add >= 10)
		{
			temp2 = (*iter1) + (*iter2) + add;
			result.push_back(temp2);
			add = 1;		
		}

		//沒有進位
		if( (*iter1) + (*iter2) + add < 10)
		{
			temp2 = (*iter1) + (*iter2) + add;
			result.push_back(temp2);
			add = 0;
		}
		iter2++;
	}
}

//輸出結果
void solution::output()
{
	for(list<int>::iterator  iter = result.begin(); iter != result.end(); iter++)
	{
		cout<<*iter;
	}

}

int main()
{
	solution s;
	s.input();//輸入數字,存入連結串列
	s.polishing();//補齊連結串列
	s.count();//求和
	s.output();//輸出結果

	return 0;
}

Java (1)
  //連結串列初始化
    public node addTwoNumbers(node l1, node l2) {
        node node1 = l1;
        node node2 = l2;

        //node1、node2不為空時進入循壞
        while (node1 != null)
        {
            if (node2 != null){
                node1.data += node2.data;//node1.data=node1.data+node2.data
                node2 = node2.next;//node2移到下一結點
            }

            //如果node1的下一結點為空且node2的下一結點不為空
            if (node1.next == null && node2!=null){
                node1.next = node2;//node1的下一結點等於node2
            }
            node1 = node1.next;//node1移到下一結點
        }
        return node1;//返回node1
    }

    public void marge(node node)
    {
        //node不為空時
        while (node != null){
            //node的資料大於10
            if (node.data >= 10){
                //進位
                node.data = node.data%10;
                if (node.next == null)//如果node的下一結點為空
                {
                    //node的下一結點等於0
                    node.next = new node(0);
                }
                node.next.data +=1;//node的下一結點等於0+1
            }
        }
    }

    public node addTwoNumbers2(node l1, node l2) {
        //宣告
        node pre = new node(0);
        node cur = pre;
        int carry = 0;

        //L1、L2不為空時進入循壞
        while(l1 != null || l2 != null) {
            int x = l1 == null ? 0 : l1.data;//L1為空則返回0賦給x,否則返回L1的資料
            int y = l2 == null ? 0 : l2.data;//L2為空則返回0賦給y,否則返回L2的資料
            int sum = x + y + carry;

            carry = sum / 10;//進位數等於0或1
            sum = sum % 10;
            cur.next = new node(sum);//cur的下一結點等於sum

            cur = cur.next;
            if(l1 != null) //如果L1為空
                l1 = l1.next;//指向下一結點
            if(l2 != null)//如果L2為空
                l2 = l2.next;//指向下一結點
        }
        //進位了
        if(carry == 1) {
            cur.next = new node(carry);
        }
        return pre.next;
    }
Java(2)
  //static是一個修飾符,用於修飾類的成員方法、類的成員變數,它修飾的方法稱為靜態方法
    static node head = null;//節點指標域
    static node tem = null;//節點指標域

    class node {
        int data;           //節點資料域
        node next = null;  //節點指標域

        public node(int data) {
            this.data = data;   //當構造一個新的節點的時候,順便給節點進行初始化
        }
    }

    public void addNode(int d){
        node N = new node(d);
        //如果頭結點為空
        if(head==null){
            head = N;//把N賦給頭結點
            return;  /*由於每次是增加一個節點,所以對頭結點進行初始化之後就要退出函式*/
        }
        tem = head;  /*一般一個連結串列的頭結點是不能動的,因此需要把頭結點賦值給一個臨時變數
		這樣在對連結串列進行訪問的時候,就可以用這個臨時變數進行逐個的訪問,不對頭結點產生影響*/
        //如果tem的下一結點不為空
        while(tem.next!=null){
            tem = tem.next;//移到下一結點
        }
        tem.next = N;//N賦給tem的下一結點
    }