高频笔试题16

139 阅读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;
    }
};

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

面试常考题相交链表 题目已经保证链表中不存在环的问题,那就很好写了。先让两个链表的指针的位置相对一样,然后同时向右移动,直到两指针相等,详细注释已经放在代码里了,相信对大家有所帮助

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