力扣第二题 C#版

本文介绍了一种使用链表表示非负整数并进行相加的方法。链表中数字以逆序方式存储,每位数字存储在一个节点上。通过迭代链表,逐位相加并处理进位,最终返回表示两数之和的新链表。

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。


示例

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


namespace Algorithm
{
    public class ListNode
    {
        public int val;
        public ListNode next;
        public ListNode(int x) { val = x; }
    }

    public class Solution
    {
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            int carry = 0;
            ListNode node = new ListNode(0);
            ListNode temp = node;
            while (true)
            {
                int sumVal = l1.val + l2.val + carry;
                if (sumVal >= 10)
                {
                    carry = 1;
                    sumVal %= 10;
                }
                else
                {
                    carry = 0;
                }

                temp.next = new ListNode(sumVal);
                temp = temp.next;

                if (l1.next == null && l2.next == null)
                {
                    if (carry > 0)
                    {
                        temp.next = new ListNode(1);
                    }
                    return node.next;
                }

                if (l1.next != null)
                {
                    l1 = l1.next;
                }
                else
                {
                    l1.val = 0;
                }

                if (l2.next != null)
                {
                    l2 = l2.next;
                }
                else
                {
                    l2.val = 0;
                }
            }
        }
    }
}

 

<think>好的,我现在需要帮用户找到力扣第6的Python答案。首先,我得确认第6是什么目。力扣目编号对应目名称可能会有变化,但通常第6是“Z 字形变换”(ZigZag Conversion)。不过我得再确认一下,避免搞错。 用户提到需要Python的答案,所以我要回忆或者查找相关的解思路。根据之前的引用内容,用户提供的参考里有关于二进制求和和最长连续序列的解,但第6可能不在其中。不过,我可以根据常见的解法来构建答案。 首先,目的大意是将字符串按照Z字形排列,然后按行读取得到新的字符串。例如,输入字符串为"PAYPALISHIRING",行数为3时,排列成: P A H N A P L S I I G Y I R 然后按行读取成"PAHNAPLSIIGYIR"。 解的关键在于找出字符在每一行的位置规律。通常有两种方法:模拟Z字形排列或者直接计算每个字符所在的行数。 方法一:模拟法。创建一个列表,每个元素代表一行。然后按照Z字形的顺序,将字符逐个添加到对应的行中。需要控制方向,当到达最上面或最下面一行时,改变方向。 方法二:直接计算位置。观察每一行的字符在原字符串中的索引,可以发现周期性的规律。例如,对于行数numRows,周期是2*numRows -2。每个周期内的字符分布到不同的行,然后处理每个周期中的字符。 根据用户的引用[3],提到了使用哈希表(集合)来优化查找,但可能这不适用于Z字形变换。所以可能需要采用模拟法或者数学方法。 接下来,我需要确保Python代码的正确性,并且符合用户的要求。例如,模拟法的步骤是: 1. 处理特殊情况,如numRows为1或者字符串长度小于等于numRows时,直接返回原字符串。 2. 初始化一个列表rows,每个元素存储对应行的字符。 3. 定义当前行curRow和方向direction(向下时为1,向上时为-1)。 4. 遍历每个字符,添加到当前行,然后根据是否到达边界改变方向。 5. 最后将各行的字符拼接起来。 这个方法的时间复杂度是O(n),空间复杂度是O(n),应该是最优的。 然后,我需要编写对应的Python代码,并确保符合用户的格式要求,比如行内数学公式用$...$,独立公式用$$...$$。例如,周期长度可以表示为$T = 2 \times \text{numRows} - 2$。 此外,用户要求生成相关问,我需要根据Z字形变换的目特点,设计相关的问,比如优化方法、不同解法比较、应用场景等。 最后检查引用部分,虽然用户提供的引用可能不直接相关,但如果有必要的话,可以适当提及,但根据用户的问,可能不需要引用。因此,可能不需要添加引用标识,但需要确认是否有相关内容可以引用。例如,引用[3]中的哈希表可能不适用,所以可能不引用。 综上,我需要整理出清晰的解步骤,提供正确的Python代码,并生成相关问。</think>### 力扣第6:Z 字形变换(Python解答) **目要求**:将字符串按"Z"字形排列后按行拼接。例如输入$s = \text{"PAYPALISHIRING"}$,$numRows = 3$时输出$\text{"PAHNAPLSIIGYIR"}$。 #### 方法一:模拟Z字形排列 **核心思路**:用列表存储每行字符,按“向下→斜向上”的路径遍历字符串,根据方向变化调整行索引。 ```python def convert(s: str, numRows: int) -> str: if numRows == 1 or len(s) <= numRows: return s rows = [''] * numRows cur_row, direction = 0, 1 # 初始方向向下 for char in s: rows[cur_row] += char if cur_row == 0: # 触顶则转向下 direction = 1 elif cur_row == numRows - 1: # 触底则转向上 direction = -1 cur_row += direction return ''.join(rows) ``` **复杂度分析**: - 时间复杂度:$O(n)$,遍历字符串一次 - 空间复杂度:$O(n)$,存储所有字符 #### 方法二:数学规律直接计算 **核心公式**:周期$T = 2 \times numRows - 2$,每周期内字符分布满足: $$ \begin{cases} i \mod T = k \quad \text{(第k行)} \\ i \mod T = T - k \quad \text{(中间斜线行)} \end{cases} $$ ```python def convert(s: str, numRows: int) -> str: if numRows == 1: return s cycle = 2 * numRows - 2 result = [] for row in range(numRows): for i in range(row, len(s), cycle): result.append(s[i]) # 处理中间斜线部分(非首尾行) if row != 0 and row != numRows - 1: mid = i + cycle - 2 * row if mid < len(s): result.append(s[mid]) return ''.join(result) ``` **复杂度分析**: - 时间复杂度:$O(n)$ - 空间复杂度:$O(n)$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值