牛客網高頻演算法題系列-BM11-連結串列相加(二)

雄獅虎豹 發表於 2022-06-10
演算法

牛客網高頻演算法題系列-BM11-連結串列相加(二)

題目描述

假設連結串列中每一個節點的值都在 0 - 9 之間,那麼連結串列整體就可以代表一個整數。給定兩個這種連結串列,請生成代表兩個整數相加值的結果連結串列。

原題目見:BM11 連結串列相加(二)

解法一:使用棧

首先,特殊情況判斷:

  • 如果連結串列一為空,則直接返回連結串列二
  • 如果連結串列二為空,則直接返回連結串列一

否則,使用2個棧用來存放兩個連結串列的結點:

  • 首先將兩個連結串列中的結點新增到棧中;
  • 遍歷2個棧,即執行加法,將值新增到新的棧中這樣可以按倒序進行結點值相加,其中需要使用一個變數記錄進位值;
  • 需要注意的是,遍歷結束後,需要根據進位值判斷是否需要新增額外的結點;
  • 最後,根據新的棧構造相加後的連結串列並返回之。

如果不想使用多餘的棧空間,可以考慮先將兩個連結串列倒序排列後,再執行加法。

程式碼

import java.util.Stack;

public class Bm011 {

    /**
     * 連結串列相加:使用棧
     *
     * @param head1 ListNode類
     * @param head2 ListNode類
     * @return ListNode類
     */
    public static ListNode addInList(ListNode head1, ListNode head2) {
        // 如果連結串列一為空,則直接返回連結串列二
        if (head1 == null) {
            return head2;
        }
        // 如果連結串列二為空,則直接返回連結串列一
        if (head2 == null) {
            return head1;
        }
        // 2個棧用來存放兩個連結串列的結點
        Stack<ListNode> nodes1 = new Stack<>();
        Stack<ListNode> nodes2 = new Stack<>();
        while (head1 != null) {
            nodes1.push(head1);
            head1 = head1.next;
        }
        while (head2 != null) {
            nodes2.push(head2);
            head2 = head2.next;
        }

        // 記錄進位值
        int addOne = 0;
        Stack<Integer> newNodes = new Stack<>();
        // 遍歷棧,即執行加法,將值新增到新的棧中
        while (!nodes1.isEmpty() || !nodes2.isEmpty()) {
            int val1 = 0, val2 = 0, newVal = 0;
            if (!nodes1.isEmpty()) {
                val1 += nodes1.pop().val;
            }
            if (!nodes2.isEmpty()) {
                val2 += nodes2.pop().val;
            }
            newVal += addOne + val1 + val2;
            if (newVal > 9) {
                newVal = newVal % 10;
                addOne = 1;
            } else {
                addOne = 0;
            }
            newNodes.push(newVal);
        }
        if (addOne == 1) {
            newNodes.push(1);
        }
        ListNode newHead = new ListNode(-1);
        ListNode next = newHead;
        while (!newNodes.isEmpty()) {
            next.next = new ListNode(newNodes.pop());
            next = next.next;
        }
        return newHead.next;
    }

    public static void main(String[] args) {
        // 連結串列一: 1 -> 3 -> 5
        ListNode head1 = ListNode.testCase3();
        // 連結串列二: 2 -> 4 -> 6
        ListNode head2 = ListNode.testCase4();

        // 測試用例,期望輸出: 3 -> 8 -> 1
        ListNode.print(addInList(head1, head2));
    }
}
$1.01^{365} ≈ 37.7834343329$
$0.99^{365} ≈ 0.02551796445$
相信堅持的力量!

相關文章