1. 程式人生 > >【兩次過】Lintcode 904. 加一連結串列

【兩次過】Lintcode 904. 加一連結串列

給定一個非負整數,這個整數表示為一個非空的單鏈表,每個節點表示這個整數的一位。返回這個整數加一。

除了0本身,所有數字在最高位前都沒有0。

列表的頭節點存的是這個整數的最高位。

樣例

給出連結串列1 -> 2 -> 3 -> null,返回 1 -> 2 -> 4 -> null


解題思路:

因為可能頭節點會變化,所以設定dummy結點,特別地,將dummy.val = 1,因為當9,99,999的時候+1,均會多出一個節點1。所以可以利用這個dummy節點可能當作這個節點。

基本思想是,設定tail和node兩個節點,分別指向尾部和尾部前一個節點,依次迴圈向前遍歷加一,最後特別考慮頭節點進位增加節點的情況。

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param head: the first Node
     * @return: the answer after plus one
     */
    public ListNode plusOne(ListNode head) {
        // Write your code here
        if(head == null)
            return null;
        
        ListNode dummy = new ListNode(1);
        dummy.next = head;
        
        ListNode tail = null;
        int cnt = 1;
        
        //迴圈向前遍歷加一
        while(cnt != 0 && tail != head){
            ListNode node = head;
            
            while(node.next != tail)
                node = node.next;
            
            int sum = node.val + cnt;
            node.val = sum % 10;
            cnt = sum / 10;
        
            tail = node;
        }
        
        //考慮最後頭節點前新增1的情況
        if(cnt != 0)
            return dummy;
        else
            return dummy.next;
    }
}