本文已参与「新人创作礼」活动,一起开启掘金创作之路。
排序链表 我的做法分为以下几步: 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;
}
};
这道题目可能开始做不出来,这很正常,但是你要学会如何去写出这种题目,链表是笔试常考的题目,一般都会让你手写出来,也能让面试官很好的看清你的思路,这题目我一开始也没写出来,得自己去找资料,看各种题解,自己画图,搞清楚了,也就写的很快了,春招实习加油
面试常考题相交链表 题目已经保证链表中不存在环的问题,那就很好写了。先让两个链表的指针的位置相对一样,然后同时向右移动,直到两指针相等,详细注释已经放在代码里了,相信对大家有所帮助
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
//先求两个链表长度
int lenA = 0, lenB = 0;
while(curA != NULL) {
lenA++;
curA = curA->next;
}
while(curB != NULL) {
lenB++;
curB = curB->next;
}
//重新指向新的头节点
curA = headA;
curB = headB;
//将链表长的强行赋值给cur
if(lenB > lenA) {
swap(lenA, lenB);
swap(curA, curB);
}
//算出两链表的长度差,将链表的起始位置相同
int len = lenA - lenB;
while(len--) {
curA = curA->next;
}
//判断两链表是否相交
while(curA) {
if(curA == curB) {
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};