兩數相加

思路:

取出鏈表對應結點的值,相加結果存到新鏈表對應的結點,因爲每一個結點只存一位數,而相加結果有多是兩位,所以須要進位,每次相加時將進位加入計算。ide

具體以下:

建立兩個結點用來分別遍歷兩個鏈表,都指向對應鏈表的首結點。
建立新鏈表存放結果,初始化值爲0,建立一個結點用來存放每次的結果,
1)遍歷兩鏈表,直到兩鏈表都爲空:
a:取出兩鏈表的值與進位carry相加爲sum,該值可能大於10,所以用carry保存每次相加的結果的進位進位值carry=sum/10,
b:將sum的個位(sum%10)存入新鏈表中下一個結點(這樣,提早建立了新的結點,新鏈表前移時就不會報空指針異常)
c:用於遍歷的兩個結點前進一步。
d: 新鏈表也前進一步。
2)最後,遍歷結束,判斷carry是否爲0,若不爲0,則將carry的值存入新鏈表的下一個結點。指針

參考代碼:

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode cur1=l1;
        ListNode cur2=l2;
        ListNode result=new ListNode(0);
        ListNode cur=result;
        int carry=0;
        int x=0;
        int y=0;
        int sum=0;
        while(cur1!=null||cur2!=null){
            if(cur1!=null){
                x=cur1.val;
            }else{
                x=0;
            }
            if(cur2!=null){
                y=cur2.val;
            }else{
                y=0;
            }
            sum=x+y+carry;
            carry=sum/10;
            cur.next=new ListNode(sum%10);
            cur=cur.next;
            if(cur1!=null){
                cur1=cur1.next;
            }
            if(cur2!=null){
                cur2=cur2.next;
            }
        }
        if(carry!=0){
            cur.next=new ListNode(carry);
        }

        return result.next;
    }
相關文章
相關標籤/搜索