1. 程式人生 > >演算法:兩個連結串列以逆序組成數字相加

演算法:兩個連結串列以逆序組成數字相加

題目:

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

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

剛拿到這道題,可能的想法會是將連結串列以逆序恢復成兩個百位數,然後將兩個百位數相加,再以連結串列形式輸出,那麼時間就會浪費在連結串列轉換成數字然後再轉換成連結串列的過程中了。

於是,我們產生了一個想法,為什麼不直接在連結串列的基礎上進行各位的相加呢?

程式碼:

public ListNode addTwoNumbers(ListNode l1, ListNode l2)
{
    ListNode temp1,temp2,resultList,tail;
    tail=resultList = null;
    boolean addFlag = false;//進位標記,false代表無進位,true代表有進位
    for(temp1 = l1,temp2 = l2;temp1!=null||temp2!=null;temp1 = temp1.
next,temp2 = temp2.next) { //當兩個連結串列長度不一致時,預設短的那個連結串列的那一位的數字為0 //例如:1->8和0相加 if(temp1 == null) { temp1 = new ListNode(0); } if(temp2 == null) { temp2 = new ListNode(0); } int result = temp1.val+temp2.val; //如果上一位有進位,則要在這一位上+1,並將進位標記重新置為false
if(addFlag) { result++; addFlag = false; } //相加大於等於零代表要進位 if(result>=10) { addFlag = true; result-=10; } ListNode temp = resultList; ListNode a = new ListNode(result); //尾插連結串列節點 if(resultList != null) { tail.next=a; tail = a; } else { resultList = a; tail=a; } } //當連結串列已經遍歷完成,但是有進位,所以要建立新的一位並且這一位的數字是1 if(addFlag) { tail.next = new ListNode(1); } return resultList; }

測試一下:

public static void main(String[] args)
    {
       A a = new A();
       ListNode a1 = new ListNode(1);
       ListNode a2 = new ListNode(8);
        a1.next = a2;
        ListNode b1 = new ListNode(0);
       ListNode head = a.addTwoNumbers(a1,b1);
       for(;head!=null;head = head.next)
       {
           System.out.print(head.val);
       }

    }

輸出結果:
在這裡插入圖片描述
成功!