1. 链表
合并两个有序链表
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* preHead = new ListNode(-1);
//一定要使用头指针并复制一个副本,不然后面循环操作不统一,未合并完的也不好加上去
ListNode* prev = preHead;
while (l1&&l2) {
if (l1->val < l2->val) {
prev->next = l1;//链入pre
l1 = l1->next;//指针后移
} else {
prev->next = l2;
l2 = l2->next;
}
prev = prev->next;//pre指针后移
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev->next = l1 == nullptr ? l2 : l1;
return preHead->next;
}
//也可以使用递归
};
删除链表的倒数第N位
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//删除倒数第n个节点,前一节点要指向倒数n+1
ListNode* p1 =head;
ListNode* p2 =head;
for(int i=0;inext;
if(!p2) return head->next;//对于第一个点被删除的处理,也可以设一个头结点统一所有操作
while(p2->next){
p1=p1->next;
p2=p2->next;
}
p1->next=p1->next->next;
return head;
}
};