Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/2181.html
2181. Merge Nodes in Between Zeros (Medium)
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
.
Similar Questions:
Solution 1.
-
// OJ: https://leetcode.com/problems/merge-nodes-in-between-zeros/ // Time: O(N) // Space: O(1) class Solution { public: ListNode* mergeNodes(ListNode* head) { ListNode dummy, *tail = &dummy; while (head) { if (head->val == 0) head = head->next; // skip leading `0` if (!head) break; int sum = 0; while (head->val != 0) { // sum numbers before the next `0` sum += head->val; head = head->next; } tail->next = new ListNode(sum); // append `sum` tail = tail->next; } return dummy.next; } };
-
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: dummy = tail = ListNode() s = 0 cur = head.next while cur: if cur.val != 0: s += cur.val else: tail.next = ListNode(s) tail = tail.next s = 0 cur = cur.next return dummy.next ############ # 2181. Merge Nodes in Between Zeros # https://leetcode.com/problems/merge-nodes-in-between-zeros/ # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: curr = res = ListNode(-1) s = 0 head = head.next while head: if head.val == 0: curr.next = ListNode(s) curr = curr.next s = 0 else: s += head.val head = head.next return res.next
-
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeNodes(ListNode head) { ListNode dummy = new ListNode(); int s = 0; ListNode tail = dummy; for (ListNode cur = head.next; cur != null; cur = cur.next) { if (cur.val != 0) { s += cur.val; } else { tail.next = new ListNode(s); tail = tail.next; s = 0; } } return dummy.next; } }
-
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeNodes(head *ListNode) *ListNode { dummy := &ListNode{} tail := dummy s := 0 for cur := head.Next; cur != nil; cur = cur.Next { if cur.Val != 0 { s += cur.Val } else { tail.Next = &ListNode{Val: s} tail = tail.Next s = 0 } } return dummy.Next }
-
/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ function mergeNodes(head: ListNode | null): ListNode | null { const dummy = new ListNode(); let cur = dummy; let sum = 0; while (head) { if (head.val === 0 && sum !== 0) { cur.next = new ListNode(sum); cur = cur.next; sum = 0; } sum += head.val; head = head.next; } return dummy.next; }
-
// 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 merge_nodes(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> { let mut dummy = Box::new(ListNode::new(-1)); let mut cur = &mut dummy; let mut sum = 0; while let Some(node) = head { if node.val == 0 && sum != 0 { cur.next = Some(Box::new(ListNode::new(sum))); cur = cur.as_mut().next.as_mut().unwrap(); sum = 0; } sum += node.val; head = node.next; } dummy.next.take() } }
Solution 2.
If we are asked to do it in-place.
-
// OJ: https://leetcode.com/problems/merge-nodes-in-between-zeros/ // Time: O(N) // Space: O(1) as it's done in-place class Solution { public: ListNode* mergeNodes(ListNode* head) { ListNode dummy, *tail = &dummy; while (head) { if (head->val == 0) head = head->next; if (!head) break; auto node = head; head = head->next; while (head->val != 0) { node->val += head->val; head = head->next; } tail->next = node; tail = tail->next; node->next = nullptr; } return dummy.next; } };
-
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: dummy = tail = ListNode() s = 0 cur = head.next while cur: if cur.val != 0: s += cur.val else: tail.next = ListNode(s) tail = tail.next s = 0 cur = cur.next return dummy.next ############ # 2181. Merge Nodes in Between Zeros # https://leetcode.com/problems/merge-nodes-in-between-zeros/ # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: curr = res = ListNode(-1) s = 0 head = head.next while head: if head.val == 0: curr.next = ListNode(s) curr = curr.next s = 0 else: s += head.val head = head.next return res.next
-
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeNodes(ListNode head) { ListNode dummy = new ListNode(); int s = 0; ListNode tail = dummy; for (ListNode cur = head.next; cur != null; cur = cur.next) { if (cur.val != 0) { s += cur.val; } else { tail.next = new ListNode(s); tail = tail.next; s = 0; } } return dummy.next; } }
-
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeNodes(head *ListNode) *ListNode { dummy := &ListNode{} tail := dummy s := 0 for cur := head.Next; cur != nil; cur = cur.Next { if cur.Val != 0 { s += cur.Val } else { tail.Next = &ListNode{Val: s} tail = tail.Next s = 0 } } return dummy.Next }
-
/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ function mergeNodes(head: ListNode | null): ListNode | null { const dummy = new ListNode(); let cur = dummy; let sum = 0; while (head) { if (head.val === 0 && sum !== 0) { cur.next = new ListNode(sum); cur = cur.next; sum = 0; } sum += head.val; head = head.next; } return dummy.next; }
-
// 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 merge_nodes(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> { let mut dummy = Box::new(ListNode::new(-1)); let mut cur = &mut dummy; let mut sum = 0; while let Some(node) = head { if node.val == 0 && sum != 0 { cur.next = Some(Box::new(ListNode::new(sum))); cur = cur.as_mut().next.as_mut().unwrap(); sum = 0; } sum += node.val; head = node.next; } dummy.next.take() } }
If you are asked to add the code to free node:
-
// OJ: https://leetcode.com/problems/merge-nodes-in-between-zeros/ // Time: O(N) // Space: O(1) as it's done in-place class Solution { public: ListNode* mergeNodes(ListNode* head) { ListNode dummy, *tail = &dummy; while (head) { if (head->val == 0) { auto p = head; head = head->next; delete p; } if (!head) break; auto node = head; head = head->next; while (head->val != 0) { node->val += head->val; auto p = head; head = head->next; delete p; } tail->next = node; tail = tail->next; node->next = nullptr; } return dummy.next; } };
-
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: dummy = tail = ListNode() s = 0 cur = head.next while cur: if cur.val != 0: s += cur.val else: tail.next = ListNode(s) tail = tail.next s = 0 cur = cur.next return dummy.next ############ # 2181. Merge Nodes in Between Zeros # https://leetcode.com/problems/merge-nodes-in-between-zeros/ # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: curr = res = ListNode(-1) s = 0 head = head.next while head: if head.val == 0: curr.next = ListNode(s) curr = curr.next s = 0 else: s += head.val head = head.next return res.next
-
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeNodes(ListNode head) { ListNode dummy = new ListNode(); int s = 0; ListNode tail = dummy; for (ListNode cur = head.next; cur != null; cur = cur.next) { if (cur.val != 0) { s += cur.val; } else { tail.next = new ListNode(s); tail = tail.next; s = 0; } } return dummy.next; } }
-
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func mergeNodes(head *ListNode) *ListNode { dummy := &ListNode{} tail := dummy s := 0 for cur := head.Next; cur != nil; cur = cur.Next { if cur.Val != 0 { s += cur.Val } else { tail.Next = &ListNode{Val: s} tail = tail.Next s = 0 } } return dummy.Next }
-
/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */ function mergeNodes(head: ListNode | null): ListNode | null { const dummy = new ListNode(); let cur = dummy; let sum = 0; while (head) { if (head.val === 0 && sum !== 0) { cur.next = new ListNode(sum); cur = cur.next; sum = 0; } sum += head.val; head = head.next; } return dummy.next; }
-
// 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 merge_nodes(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> { let mut dummy = Box::new(ListNode::new(-1)); let mut cur = &mut dummy; let mut sum = 0; while let Some(node) = head { if node.val == 0 && sum != 0 { cur.next = Some(Box::new(ListNode::new(sum))); cur = cur.as_mut().next.as_mut().unwrap(); sum = 0; } sum += node.val; head = node.next; } dummy.next.take() } }
Discuss
https://leetcode.com/problems/merge-nodes-in-between-zeros/discuss/1784739/