给单链表加一
难度:
标签:
题目描述
代码结果
运行时间: 24 ms, 内存: 0.0 MB
/*
* 题目思路:
* 通过Java Stream处理链表加一。首先将链表转换为列表,
* 然后对列表进行加一处理,再将列表转换回链表。
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class AddOneToListStream {
// 将链表转换为列表
private static List<Integer> listNodeToList(ListNode head) {
List<Integer> list = new ArrayList<>();
while (head != null) {
list.add(head.val);
head = head.next;
}
return list;
}
// 将列表转换为链表
private static ListNode listToListNode(List<Integer> list) {
Collections.reverse(list);
ListNode dummy = new ListNode(0);
ListNode current = dummy;
for (int num : list) {
current.next = new ListNode(num);
current = current.next;
}
return dummy.next;
}
// 给链表加一的方法
public static ListNode plusOne(ListNode head) {
List<Integer> list = listNodeToList(head);
Collections.reverse(list);
List<Integer> result = new ArrayList<>();
int carry = 1;
for (int num : list) {
int sum = num + carry;
result.add(sum % 10);
carry = sum / 10;
}
if (carry > 0) {
result.add(carry);
}
return listToListNode(result);
}
}
解释
方法:
这个题解使用了递归的方法。首先检查头节点的值是否为0,如果是则直接返回一个值为1的新节点。否则进入递归函数dfs,从链表的尾部开始,将每个节点的值加上一个进位值(初始为1),计算结果对10取模作为新的节点值,并将进位值传递给下一层递归。递归结束后,如果最后的进位值大于0,则在链表头部新增一个节点来容纳这个进位。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在头节点值为0的特殊情况下,您选择直接返回一个值为1的新节点而不是继续递归处理整个链表?
▷🦆
递归函数中,如果当前节点为空,为什么返回的是进位值1而不是0?这是否与特定情况有关?
▷🦆
在递归中处理每个节点时,您是如何确保链表的最终结果仍然保持单链表的顺序而不会发生逆转?
▷🦆
您提到如果最后的进位值大于0,则需要在链表头部新增一个节点。请问这种情况通常是在什么样的输入下发生?
▷