力扣 1474. 刪除連結串列 M 個節點之後的 N 個節點
阿新 • • 發佈:2020-12-14
技術標籤:力扣刷題
給定連結串列 head 和兩個整數 m 和 n. 遍歷該連結串列並按照如下方式刪除節點:
開始時以頭節點作為當前節點.
保留以當前節點開始的前 m 個節點.
刪除接下來的 n 個節點.
重複步驟 2 和 3, 直到到達連結串列結尾.
在刪除了指定結點之後, 返回修改過後的連結串列的頭節點.
進階問題: 你能通過就地修改連結串列的方式解決這個問題嗎?
示例 1:
輸入: head = [1,2,3,4,5,6,7,8,9,10,11,12,13], m = 2, n = 3
輸出: [1,2,6,7,11,12]
解析: 保留前(m = 2)個結點, 也就是以黑色節點表示的從連結串列頭結點開始的結點(1 ->2).
繼續相同的操作, 直到連結串列的末尾.
返回刪除結點之後的連結串列的頭結點.
示例 2:
輸入: head = [1,2,3,4,5,6,7,8,9,10,11], m = 1, n = 3
輸出: [1,5,9]
解析: 返回刪除結點之後的連結串列的頭結點.
示例 3:
輸入: head = [1,2,3,4,5,6,7,8,9,10,11], m = 3, n = 1
輸出: [1,2,3,5,6,7,9,10,11]
示例 4:
輸入: head = [9,3,7,7,9,10,8,2], m = 1, n = 2
提示:
1 <= 連結串列結點數 <= 10^4.
[1 <= 連結串列的每一個結點值 <=10^6].
1 <= m,n <= 1000
/**
* 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* deleteNodes(ListNode* head, int m, int n) {
ListNode* p=head;
int lm=1,ln=0;
while(p&&p->next){
if(lm<m){
p=p->next;
lm++;
ln=0;
}
else{
if(ln==n){
lm=0;
}
else{
p->next=p->next->next;
ln++;
}
}
}
return head;
}
};