高频笔试题--链表

157 阅读2分钟

排序链表 我的做法分为以下几步:

1.特殊判定

2.链表分成两部分

3.排序后再来合并链表

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        //  特殊判定
        if(head == nullptr || head->next == nullptr) {
            return head;
        }

        //使用归并排序和快慢指针来将链表分为两段
        ListNode* slow = head;
        ListNode* fast = head;
        ListNode* brk = nullptr;    //这个指针用于将链表断开

        while(fast && fast->next) {
            fast = fast->next->next;
            
            //关键位置:这里需要提前将链表断开
            if(fast == nullptr || fast->next == nullptr) {
                brk = slow;
            }
            slow = slow->next;
        }
        brk->next = nullptr;    //这样就能彻底将链表分成两部分

        //用两个新头节点来接受这两段链表的数据,顺便将链表排好序
        ListNode* head1 = sortList(head);
        ListNode* head2 = sortList(slow);
        ListNode* dummy = new ListNode(0);
        ListNode* cur = dummy;
        while(head1 || head2) {
            if(head1 == nullptr || (head1 != nullptr && head2 != nullptr && head1->val >= head2->val)) {
                cur->next = head2;
                cur = cur->next;
                head2 = head2->next;
            }else {
                cur->next = head1;
                cur = cur->next;
                head1 = head1->next;
            }
        }
        return dummy->next;
    }
};

这道题目可能开始做不出来,这很正常,但是你要学会如何去写出这种题目,链表是笔试常考的题目,一般都会让你手写出来,也能让面试官很好的看清你的思路,这题目我一开始也没写出来,得自己去找资料,看各种题解,自己画图,搞清楚了,也就写的很快了

1.定义全局静态变量和局部静态变量:在变量前面加上static关键字。初始化的静态变量会在.data段分配内存,未初始化的静态变量会在.bss段分配内存。直到程序结束,静态变量始终会维持前值。只不过全局静态变量和局部静态变量的作用域不一样;

2.定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用;

3.在变量类型前加上static关键字,变量即被定义为静态变量。静态变量只能在本源文件中使用;

//示例
static int a;
static void func();

4.在c++中,static关键字可以用于定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间。

5.在c++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。只需要在函数前加上关键字static即可。如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。