You are given the head of a linked list, which contains a series of integers separated by 0’s. The beginning and end of the linked list will have Node.val == 0.
For every two consecutive 0’s, merge all the nodes lying in between them into a single node whose value is the sum of all the merged nodes. The modified list should not contain any 0’s.
Return the head of the modified linked list.
Example 1:
Input: head = [0,3,1,0,4,5,2,0]
Output: [4,11]
Explanation:
The above figure represents the given linked list. The modified list contains
- The sum of the nodes marked in green: 3 + 1 = 4.
- The sum of the nodes marked in red: 4 + 5 + 2 = 11.
Example 2:
Input: head = [0,1,0,3,0,2,2,0]
Output: [1,3,4]
Explanation:
The above figure represents the given linked list. The modified list contains
- The sum of the nodes marked in green: 1 = 1.
- The sum of the nodes marked in red: 3 = 3.
- The sum of the nodes marked in yellow: 2 + 2 = 4.
Constraints:
- The number of nodes in the list is in the range [3, 2 * 105].
- 0 <= Node.val <= 1000
- There are no two consecutive nodes with Node.val == 0.
- The beginning and end of the linked list have Node.val == 0.
这题应该会有很多种解法,遍历+递归或者单纯的遍历都可以解决问题, 或者单纯的递归应该也可以, 只是写法上可能要复杂一些。我选的第一种方式, 遍历+递归, 遇到 0 则进行递归调用得到后面的链表, 如果不是 0 则继续向后遍历累加当前 node 的 val
impl Solution {
pub fn merge_nodes(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut curr = 0;
while let Some(mut node) = head {
if node.val == 0 {
if curr == 0 {
head = node.next.take();
continue;
}
let mut n = ListNode::new(curr);
n.next = Solution::merge_nodes(node.next.take());
return Some(Box::new(n));
}
head = node.next.take();
curr += node.val;
}
None
}
}