先从看一道最基本的链表的模拟题
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
模拟的思路就是创建一个空链表dummp,然后用两个指针分别从头遍历list1和list2,两个指针那个指针指的值小就加到dummp当中
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* node = new ListNode(-1);
ListNode *pre = node;
while(list1 != nullptr && list2 != nullptr){
int A = list1 -> val,B = list2 -> val;
if(A > B){
pre -> next = list2;
list2 = list2 -> next;
}else{
pre -> next = list1;
list1 = list1 -> next;
}
pre = pre -> next;
}
pre -> next = (list1 == nullptr ? list2 : list1);
return node -> next;
}
};
给你一个链表的头节点 head
,该链表包含由 0
分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val == 0
。
对于每两个相邻的 0
,请你将它们之间的所有节点合并成一个节点,其值是所有已合并节点的值之和。然后将所有 0
移除,修改后的链表不应该含有任何 0
。
返回修改后链表的头节点 head
。
提示:
- 列表中的节点数目在范围
[3, 2 * 105]
内 0 <= Node.val <= 1000
- 不 存在连续两个
Node.val == 0
的节点 - 链表的 开端 和 末尾 节点都满足
Node.val == 0
这道题其实跟上面的问题本质是一样的都是可以通过模拟链表(当然也有更优的解法,这里只介绍暴力)。思路就是定义一个空链表dummp,然后遍历head,如果val == 0,就把total加入到dummp当中
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeNodes(ListNode* head) {
ListNode* dummp = new ListNode();
ListNode* pre = dummp;
int total = 0;
for(ListNode* cur = head -> next;cur != nullptr;cur = cur -> next){
if(cur -> val == 0){
ListNode* node = new ListNode(total);
pre -> next = node;
pre = pre -> next;
total = 0;
}else total += cur -> val;
}
return dummp -> next;
}
};
加油