面试技巧之带头节点单链表都有哪些例题呢,都整理在这里啦(归并两个带头结点有序链表;两个链表A B, 判断链表B是否为A的子序列;设A B两个链表为带头结点的单链表,且AB升序,求AB的交集)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 面试技巧之带头节点单链表都有哪些例题呢,都整理在这里啦(归并两个带头结点有序链表;两个链表A B, 判断链表B是否为A的子序列;设A B两个链表为带头结点的单链表,且AB升序,求AB的交集)

目录


序言

设A B两个链表为带头结点的单链表,且AB升序,求AB的交集

题目与题目解析,做题步骤

完整代码  

两个链表A B, 判断链表B是否为A的子序列

题目与题目解析,做题步骤

完整代码

归并两个带头结点有序链表

题目与题目解析,做题步骤

完整代码


序言


关于带头结点单链表的构造与创建,可以在博主主页搜索“详细解析单链表带头节点的结构体定义,普通单链表与有序单链表的创建等操作”,即可查看详情,在这篇博文中,我们就直接进入正题啦


正文


设A B两个链表为带头结点的单链表,且AB升序,求AB的交集


题目与题目解析,做题步骤


 设A B两个链表为带头结点的单链表,且 A B升序,求A B的交集。

   A B都有的元素 组成一个新链表C,原 A B不动 ,且C也要升序

   eq:

       A: 1 2 2 3 5 6

       B: 1 1 1 2 2 3  (一样的取一个)

       ==>C: 1 2 3

       dsave = 0

       算法思路:    

           s1:创建一个新的头结点链表C (交集)

           s2:找相同的点 (遍历A和B 找相同的点 相同且不重复 就插入到链表C 不相同 谁小就往后移)

           s3:把相同的点加入到链表头结点

           s4: 把新链表的头结点返回。


完整代码


/*
    common_of_lists:求两个链表的交集
    @listA:链表A
    @listB:链表B
    返回值:
        交集链表C的头结点
*/
List *common_of_lists(List *listA, List *listB)
{
    ElemType dsave = 0;
    Node *pnew = NULL;
    // s1:创建一个新的头结点链表C (交集)
    List *listC = malloc(sizeof(*listC));
    listC->first = NULL;
    listC->last = NULL;
    listC->NodeNum = 0;
    // s2:找相同的点 (遍历A和B 找相同的点 相同且不重复 就插入到链表C 不相同 谁小就往后移)
    Node *pa = listA->first;
    Node *pb = listB->first;
    while(pa && pb)
    {
        if(pa->data == pb->data)// s3:把相同的点加入到链表头结点
        {
            if(pa->data != dsave)//如果该节点与上一个结点的值不重复 就添加到新的链表C中
            {
                pnew = malloc(sizeof(*pnew));
                pnew->data = pa->data;
                pnew->next = NULL;
                if(listC->first == NULL)//从无到有
                {
                    listC->first = pnew;
                    listC->last = pnew;
                }
                else//从少到多尾插
                {
                    listC->last->next = pnew;
                    listC->last = pnew;
                }
                listC->NodeNum++;
                dsave = pa->data;
            }
            pa = pa->next;
            pb = pb->next;
        }
        else if(pa->data < pb->data)//如果不相等 谁小往后走 升序,看后面有没有大一点的值 和现在的值相等
        {
            pa = pa->next;
        }
        else
        {
            pb = pb->next;
        }
    }
    // s4: 把新链表的头结点返回。
    return listC;
}


两个链表A B, 判断链表B是否为A的子序列


题目与题目解析,做题步骤


两个链表A B, 判断链表B是否为A的子序列。

   子序列:连续的一部分

   是:返回1

   不是: 返回0

   A: 1 1 1 2 3 5 6

   B: 1 1 2 3 5

   ==>OK

 

   A: 1 1 2 1 5 5 5 3

   B: 1 2 3

   ==>不ok

 

   算法思路:    

       相等 则继续往下走遍历

       不相等 B回到开头

       长链A 定义一个起始位置 不相等则起始位置往后移一位。


完整代码


/*
    judge_sublist: 判断链表B是否是链表A的子序列
    @listA: A链表
    @listB: B链表
    返回值:
        是子序列 返回1
        不是子序列 返回0
*/
int judge_sublist(List *listA, List *listB)
{
    Node *pa = listA->first;//pa链表A的遍历指针
    Node *pb = listB->first;//pb链表B的遍历指针
    Node *start_a = listA->first;//A链表的起始位置
    while(pa && pb)
    {
        if(pa->data == pb->data)//相等则继续往下遍历
        {
            pa = pa->next;
            pb = pb->next;
        }
        else//不相等 B回到起始位置 pa的位置往下走
        {
            pb = listB->first;//pb回到开头
            start_a = start_a->next;//pa的位置往后走
            pa = start_a;
        }
    }
    if(pb == NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


归并两个带头结点有序链表


题目与题目解析,做题步骤


   归并两个带头结点有序链表

       合并两个有序的升序链表成一个升序链表

       A:1 2 3 3 5 6

       B:1 5 6

     

       C=> 1 1 2 3 3 5 5 6 6

       算法思路:

           两两比较 取较小的 加入到新链表C中

           step1: 创建一个带头结点的链表C

           step2:两两比较,把较小的结点摘下来

           step3: 把摘下来的结点 加入到链表C

           step4: 返回链表C的头结点


完整代码


List *merge_two_lists(List *listA, List *listB)
{
    //step1: 创建一个带头结点的链表C
    List *listC = malloc(sizeof(*listC));
    listC->first = NULL;
    listC->last = NULL;
    listC->NodeNum = listA->NodeNum + listB->NodeNum;
    Node *pnew = NULL;//指向摘下来的那个结点
    //step2:两两比较,把较小的结点摘下来
    Node *pa = listA->first;
    Node *pb = listB->first;
    while(pa && pb)
    {
        if(pa->data < pb->data)//listA小
        {
            pnew = pa;
            listA->first = listA->first->next;
            pa->next = NULL;
        }
        else//listB小
        {
            pnew = pb;
            listB->first = listB->first->next;
            pb->next = NULL;
        }
        //step3: 把摘下来的结点 加入到链表C
        if(listC->first == NULL)//从无到有
        {
            listC->first = pnew;
            listC->last = pnew;
        }
        else//从少到多
        {
            listC->last->next = pnew;
            listC->last = pnew;
        }
        pa = listA->first;
        pb = listB->first;
    }//end while
    if(pa != NULL)//A链表有剩余
    {
        listC->last->next = listA->first;
        listC->last = listA->last;
    }
    else//B链表有剩余
    {
        listC->last->next = listB->first;
        listC->last = listB->last;
    }
    //step4: 返回链表C的头结点
    return listC;
}
相关文章
|
8天前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
46 20
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
54 0
|
2月前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
4月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
下一篇
DataWorks