排序链表 我的做法分为以下几步:
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即可。如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。