leetcode第二题两数相加

这道题目的解决方法是使用两数相加中的初等数学,利用两个数,两个数的进位这总共三个变量来进行判断
可以设置一个元组tuple,分别记录这几个数的状态,一般的状态有以下几种:

  • 两数都为None,没有进位->此时直接退出
    两数为None,有进位(这个进位是上一阶段的链表所进的位数) -> 此时结果为进位
    两个链表有一个此刻为None,根据进位状态又可以分为:
    1. 有进位,将链表值和进位相加,如果大于等于10,则结果产生新的进位,这个阶段的值为list.val+carry-10。
    2. 没有进位,将链表值和进位相加,值为list.val+carry
      两个链表都存在,结果和上一阶段类似
  • 最后将返回的值进行递进。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Definition for singly-linked list.
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>
}

impl ListNode {
#[inline]
fn new(val: i32) -> Self {
ListNode {
next: None,
val
}
}
}
impl Solution {
pub fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut result = None;
let mut tail = &mut result;
let mut t = (l1,l2,0,0);
loop {
t = match t {
(None,None,_,0) => break,
(None,None,_,carry) => (None,None,carry,0),
(Some(list),None,_,carry) | (None,Some(list),_,carry) if list.val + carry >= 10 => {
(list.next,None,list.val+carry-10,1)
}
(Some(list),None,_,carry) | (None,Some(list),_,carry) => {
(list.next,None,list.val+carry,0)
}
(Some(l1),Some(l2),_,carry) if l1.val + l2.val + carry >=10 => {
(l1.next,l2.next,l1.val+l2.val+carry-10,1)
}
(Some(l1),Some(l2),_,carry) => {
(l1.next,l2.next,l1.val+l2.val+carry,0)
}
};
*tail = Some(Box::new(ListNode::new(t.2)));
tail = &mut tail.as_mut().unwrap().next;
}
result
}
}

  • 这段代码实际上就是一种链式存储结构线性表的应用
  • 其中应用到的as_mut()

这个函数是指针的应用,如果指针为null,返回None,否则返回Some(val)。

1
2
3
4
5
let mut s = [1, 2, 3];
let ptr: *mut u32 = s.as_mut_ptr();
let first_value = unsafe { ptr.as_mut().unwrap() };
*first_value = 4;
println!("{:?}", s); // 它会打印: "[4, 2, 3]"。

确定指针永不为空,如果正在寻找某种返回&mut T而不是Option<&mut T>as_mut_unchecked,可以直接使用指针

1
2
3
4
5
let mut s = [1, 2, 3];
let ptr: *mut u32 = s.as_mut_ptr();
let first_value = unsafe { &mut *ptr };
*first_value = 4;
println!("{:?}", s); // 它会打印: "[4, 2, 3]"。