【刷题】链表

链表

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
在这里插入图片描述
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
在这里插入图片描述
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

class Solution {
    
    
public:
    ListNode* reverseList(ListNode* head) {
    
    
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr) {
    
    
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
在这里插入图片描述
输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:
在这里插入图片描述
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目在范围 [0, 5 * 104] 内
-105 <= Node.val <= 105

class Solution {
    
    
public:
    ListNode* sortList(ListNode* head) {
    
    
        if (head == nullptr) {
    
    
            return head;
        }
        int length = 0;
        ListNode* node = head;
        while (node != nullptr) {
    
    
            length++;
            node = node->next;
        }
        ListNode* dummyHead = new ListNode(0, head);
        for (int subLength = 1; subLength < length; subLength <<= 1) {
    
    
            ListNode* prev = dummyHead, *curr = dummyHead->next;
            while (curr != nullptr) {
    
    
                ListNode* head1 = curr;
                for (int i = 1; i < subLength && curr->next != nullptr; i++)
                    curr = curr->next;
                ListNode* head2 = curr->next;
                curr->next = nullptr;
                curr = head2;
                for (int i = 1; i < subLength && curr != nullptr && curr->next != nullptr; i++) {
    
    
                    curr = curr->next;
                }                
                ListNode* next = nullptr;
                if (curr != nullptr) {
    
    
                    next = curr->next;
                    curr->next = nullptr;
                }
                ListNode* merged = merge(head1, head2);
                prev->next = merged;
                while (prev->next != nullptr) {
    
    
                    prev = prev->next;
                }
                curr = next;
            }
        }
        return dummyHead->next;
    }

    ListNode* merge(ListNode* head1, ListNode* head2) {
    
    
        ListNode* dummyHead = new ListNode(0);
        ListNode* temp = dummyHead, *temp1 = head1, *temp2 = head2;
        while (temp1 != nullptr && temp2 != nullptr) {
    
    
            if (temp1->val <= temp2->val) {
    
    
                temp->next = temp1;
                temp1 = temp1->next;
            } else {
    
    
                temp->next = temp2;
                temp2 = temp2->next;
            }
            temp = temp->next;
        }
        if (temp1 != nullptr) {
    
    
            temp->next = temp1;
        } else if (temp2 != nullptr) {
    
    
            temp->next = temp2;
        }
        return dummyHead->next;
    }
};

面试题 02.05. 链表求和

给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912

class Solution {
    
    
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        ListNode* ans = new ListNode(0);
        auto now = ans;
        int c = 0, num;
        while(l1 && l2) {
    
    
            num = l1->val + l2->val+c;
            ListNode* temp = new ListNode(num%10);
            now->next = temp;
            now = now->next;
            c = num/10;
            l1 = l1->next;
            l2 = l2->next;
        }
        while(l1) {
    
    
            num = l1->val+c;
            ListNode* temp = new ListNode(num%10);
            now->next = temp;
            now = now->next;
            c = num/10;
            l1 = l1->next;
        }
        while(l2) {
    
    
            num = l2->val+c;
            ListNode* temp = new ListNode(num%10);
            now->next = temp;
            now = now->next;
            c = num/10;
            l2 = l2->next;
        }
        if (c) {
    
    
            ListNode* temp = new ListNode(c);
            now->next = temp;
            now = now->next;
        }
        return ans->next;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_42725437/article/details/134697639