数据结构中链表必备的面试题(第二期)
一、第一题
1.题目
题目 如下(示例):
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
2.思路+图解
思路一:根据链表的个数除以二得到中间结点(时间复杂度:O(N)),不符合题中只能遍历数组一次的要求!
思路二:如下图所示:
1.定义两个指针:
2.判断while停下来的条件:
3.代码
代码如下(示例):
struct ListNode
{
int val;
struct ListNode *next;
}
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow,*quick;
slow=quick=head;
while(quick && quick->next)
{
slow= slow->next;
quick= quick->next->next;
}
return slow;
}
二、第二题
1.题目
题目 如下(示例):
输入一个链表,输出该链表中倒数第k个结点。
2.思路+图解
思路:1.fast先走k步;2.slow和fast再一起走,当fast==NULL时,slow就是倒数第k个!如下图:
3.代码
代码如下(示例):
struct ListNode
{
int val;
struct ListNode *next;
}
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
struct ListNode* n1,*n2;
n1=n2=pListHead;
while(k--)
{
if(n1==NULL)
{
return NULL;
}
n1=n1->next;
}
while(n1)
{
n1=n1->next;
n2=n2->next;
}
return n2;
}
三、第三题
1.题目
代码如下(示例):
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
2.思路+图解
思路一:如下图所示:
在这里要注意两个问题:
3.源码
代码如下(示例):
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
struct ListNode* dst=NULL,*src=NULL;
while(list1 && list2)
{
if(list1->val < list2->val)
{
if(dst==NULL)
{
dst=src=list1;
}
else
{
src->next=list1;
src=list1;
}
list1=list1->next;
}
else
{
if(dst==NULL)
{
dst=src=list2;
}
else
{
src->next=list2;
src=list2;
}
list2=list2->next;
}
}
if(list1)
src->next=list1;
if(list2)
src->next= list2;
return dst;
}
总结
以上就是今天要讲的内容,本文介绍数据结构中链表必备的面试题的第二期,未来我会不断更新数据结构中一些面试题!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!