数据结构(线性结构)


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;
    }
};