2.5給定兩個用鏈表表示的整數,每個結點包含一個數位。這些數位是反向存放的,也就是個位排在鏈表首部。編寫函數對這兩個整數求和,並用鏈表形式返回結果。進階:假設這些數位是正向存放的。


其實仔細想想是挺簡單的,我們要做的只是記得進位。

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry)
//LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry = 0)
{
    if (l1 == null && l2 == null $$ carry == 0)
    {
        return null;
    }
    
    LinkedListNode result = new LinkedListNode();
    int value = carry;
    if (l1 != null)
    {
        value += l1.data;
    }
    if (l2 != null)
    {
        value += l2.data;
    }
    
    result.data = value%10;
    
    LinkedListNode more = addLists(l1 == null? null : l1.next, l2 == null? null : l2.next, value >= 10? 1 :0);
    result.setNext(more);
}

 進階:假設是正向存放的。

坑:1,注意雙方長度,雙方是末尾對齊的,不足的地方需要用0補足。

//2.5b進階:假設這些數位是正向存放的
public class PartialSum
{
    public LinkedListNode sum = null;
    public int carry = 0;
}

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2)
{
    int len1 = length(l1);
    int len2 = length(l2);
    
    //用零填充較短的鏈表
    if (len1 < len2)
    {
        l1 = padList(l1, len2 - len1);
    }
    else
    {
        l2 = padList(l2, len1 - len2);
    }
    
    //對兩個鏈表求和
    PartialSum sum = addListsHelper(l1, l2);
    
    //如有進位,則插入鏈表首部,否則,直接返回整個鏈表
    if (sum.carry == 0)
    {
        return sum.sum;
    }
    else
    {
        LinkedListNode result = insertBefore(sum.sum, sum.carry);
        return result;
    }
}

PartialSum addListsHelper(LinkedListNode l1, LinkedListNode l2)
{
    if (l1 == null && l2 == null)
    {
        PartialSum sum = new PartialSum();
        return sum;
    }
    
    //先遞歸為較小數字求和
    PartialSum sum = addListsHelper(l1.next, l2.next);
    
    //將進位和當前數據相加
    int val = sum.carry + l1.data + l2.data;
    
    //插入當前數字的求和結果
    LinkedListNode full_result = insertBefore(sum.sum, val % 10);
    
    //返回求和結果與進位值
    sum.sum = full_result;
    sum.carry = val/10;
    return sum;
}

//用零填充鏈表
LinkedListNode padList(LinkedListNode l,int padding)
{
    LinkedListNode head = l;
    for (int i = 0; i < padding; i++)
    {
        LinkedListNode n = new LinkedListNode(0, null, null);
        head.prev = n;
        n.next = head;
        head = n;
    }
    return head;
}

//輔助函數,將結點插入鏈表首部
LinkedListNode insertBefore(LinkedListNode list, int data)
{
    LinkedListNode node = new LinkedListNode(data, null, null);
    if (list != null)
    {
        list.prev = node;
        node.next = list;
    }
    return node;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。 鏈表習題(5)-給定兩個單鏈表,編寫算法找出兩個鏈表的公共結點 給定兩個單鏈表,編寫算法查找兩個鏈表的公共結點 分離整數的各個數位 將兩個有序鏈表合並為一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。  已有a、b兩個鏈表,每個鏈表中的結點包括學好、成績。要求把兩個鏈表合並,按學號升序排列。 leetcode給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,並且每個節點只能存儲 一位 數字
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM