[刷题计划]第二周第二天 | 链表

简介: [刷题计划]第二周第二天 | 链表

简单题

21. 合并两个有序链表(无题解)

23. 合并K个升序链表(无题解)

148. 排序链表(无题解)

234. 回文链表(无题解)

剑指 Offer 24. 反转链表(无题解)

剑指 Offer 18. 删除链表的节点(无题解)

面试题 02.02. 返回倒数第 k 个节点(无题解)

876. 链表的中间结点(无题解)

面试题 17.12. BiNode

面试题 02.01. 移除重复节点


中等题

2. 两数相加

86. 分隔链表

114. 二叉树展开为链表

面试题 02.05. 链表求和


难题

138. 复制带随机指针的链表

147. 对链表进行插入排序

328. 奇偶链表


题解

面试题 17.12. BiNode


struct TreeNode* hash[100010];int hashsize = 0;
void visit(struct TreeNode * root){
    if(root){
        if(root->left)  visit(root->left);
        hash[hashsize++] = root;
        if(root->right) visit(root->right);
    }
}
struct TreeNode* convertBiNode(struct TreeNode* root){
    hashsize = 0;
    visit(root);
    for(int i = 0;i < hashsize - 1;i++){
        hash[i]->left =0;
        hash[i]->right = hash[i+1];
    }
    if(!hashsize)   return NULL;
    hash[hashsize - 1]->left = 0;
    hash[hashsize - 1]->right = 0;
    return hash[0];
}

面试题 02.01. 移除重复节点


struct ListNode* removeDuplicateNodes(struct ListNode* head){
    int hash[20001];
    memset(hash,0,sizeof(hash));
    struct ListNode anshead;
    anshead.next = head;head = &anshead;//头节点
    while(head->next){
        if(!hash[head->next->val]){
            hash[head->next->val] ++;
            head = head->next;
        }
        else{
            head ->next= head->next->next;
        }
    }
    return anshead.next;
}

2. 两数相加


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int jinwei = 0;
    struct ListNode *head = malloc(sizeof(struct ListNode));
    struct ListNode *ans = head;//很多地方用头节点很省事 就 很省事?
    head->next = 0; //创建头节点
    while(l1&&l2){
        ans->next = malloc(sizeof(struct ListNode));   //创建节点
        ans = ans->next;
        ans->val = (l1->val + l2->val + jinwei) % 10;//创建信息
        jinwei = (l1->val + l2->val + jinwei) / 10;
        l1=l1->next;
        l2=l2->next;
    }
    while(l1){  //处理l1剩余
        ans->next = malloc(sizeof(struct ListNode));   //创建节点
        ans = ans->next;
        ans->val = (l1->val + jinwei) % 10;//创建信息
        jinwei = (l1->val + jinwei) / 10;
        l1=l1->next;
    }
    while(l2){  //处理l2剩余
        ans->next = malloc(sizeof(struct ListNode));   //创建节点
        ans = ans->next;
        ans->val = (l2->val + jinwei) % 10;//创建信息
        jinwei = (l2->val + jinwei) / 10;
        l2=l2->next;
    }
    while(jinwei){  //处理进位剩余
        ans->next = malloc(sizeof(struct ListNode));   //创建节点
        ans = ans->next;
        ans->val = jinwei % 10;
        jinwei/= 10;
    }
    ans->next = 0;
    return head->next;
}

86. 分隔链表


struct ListNode* partition(struct ListNode* head, int x){
    struct ListNode *small = malloc(sizeof(struct ListNode)),*p = small;//两个链表分别执行尾插
    struct ListNode *big = malloc(sizeof(struct ListNode)),*q = big;
    big->next = 0;//为了处理空串
    //根据元素进行插入
  while(head){
        if(head->val < x){
            p->next = head;
            p = p->next;
        }
        else{
            q->next = head;
            q = q->next;
        }
        head = head->next;
    }
  //链接链表
    p->next = big->next;
    q->next = 0;
    return small->next;
}

114. 二叉树展开为链表


struct TreeNode *zhan[4090];//保存先序遍历的顺序
int zhansize = 0;
void first_root(struct TreeNode * root){
    if(root){
        zhan[zhansize++] = root;
        if(root->left)  first_root(root->left);
        if(root->right) first_root(root->right);
    }
}
void flatten(struct TreeNode* root){
    first_root(root);
    int i;
    for(i = 0;i <zhansize - 1;i++){
        zhan[i]->left = 0;
        zhan[i]->right = zhan[i + 1];
    }
    if(!zhansize)   return;
    zhan[i]->left = 0;
    zhan[i]->right = 0;
    return;
}

面试题 02.05. 链表求和


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode head,*p=&head;
    int jinwei = 0;
    while(l1&&l2){
        struct ListNode *q = malloc(sizeof(struct ListNode));
        q->val = (l1->val + l2->val +jinwei) % 10;
        jinwei = (l1->val + l2->val +jinwei) / 10;
        p->next = q;
        p = q;
        l1 = l1->next;
        l2 = l2->next;
    }
    while(l1){
        struct ListNode *q = malloc(sizeof(struct ListNode));
        q->val = (l1->val +jinwei) % 10;
        jinwei = (l1->val +jinwei) / 10;
        p->next = q;
        p = q;
        l1 = l1->next;
    }
    while(l2){
        struct ListNode *q = malloc(sizeof(struct ListNode));
        q->val = (l2->val +jinwei) % 10;
        jinwei = (l2->val +jinwei) / 10;
        p->next = q;
        p = q;
        l2 = l2->next;
    }
    while(jinwei){
        struct ListNode *q = malloc(sizeof(struct ListNode));
        q->val = (jinwei) % 10;
        jinwei /= 10;
        p->next = q;
        p = q;
    }
    p->next = 0;
    return head.next;
}

138. 复制带随机指针的链表


struct Node* copyRandomList(struct Node* head) {
    if(!head) return head;
    struct Node * q = head;
    while(q){        //在每个head节点后面复制一个相同的链表
        struct Node *p = malloc(sizeof(struct Node));
        p->val = q->val;
        p->next = q->next;
        q->next = p;
        q = p->next;
    }
    q = head;
   while(q){            //复制random的指向 因为每个对应节点都在原节点后面
        if(q->random)   q->next->random = q->random->next;
        else q->next->random = 0;
        q = q->next->next;
    }
    q = head->next; //拆分出结果
    while(q->next){
        q ->next = q->next->next;
        q = q->next;
    }
    return head->next;
}

147. 对链表进行插入排序


struct ListNode* insertionSortList(struct ListNode* head){
    if(!head->next||!head)  return head;
    struct ListNode *p = head->next;
     struct ListNode anshead;//头指针 反正不返回 就在栈区把~~
   anshead.next = head;  //头指针便于插入
    head = &anshead;
    head->next->next = NULL;  //分表
    while(p){
        struct ListNode *q = head,*temp = p->next;
        while(q->next && q->next->val < p->val) q = q->next;
        p->next = q->next;
        q->next = p;
        p = temp;
    }
    return head->next;
}

328. 奇偶链表


struct ListNode* oddEvenList(struct ListNode* head){
    struct ListNode *p=0,*q=0,*ji=0,*ou=0;
    int flag = 0,count = 0;
    while(head){    //遍历链表
        if(count&1){    //奇数
            if(!flag) flag = 1;
            if(!ji)
                ji = head,p = ji;
            else
                p->next = head,p = head;
        }
        else {
            if(!flag) flag = 2;
            if(!ou)
                ou = head,q = ou;
            else
                q->next = head,q = head;
        }
        count ++;
        head = head->next;
    }
    if(flag == 1) { //链接
        p->next = ou;
        if(ou) q->next = 0;
        return ji;
    }
    else if(flag == 2){ //连接
        q->next = ji;
        if(ji) p->next = 0;
        return ou;
    }
    else return 0;  //空串
}
相关文章
|
3月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
3月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
33 0
|
3月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
27 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
3月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
51 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
40 4
|
3月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
18 1
|
3月前
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
|
3月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
3月前
|
Python
【Leetcode刷题Python】234.回文链表
两种判断链表是否为回文的方法:使用栈和拆分为两个链表后反转对比,并给出了相应的Python代码实现。
21 0