👑个人主页:啊Q闻
🎇收录专栏:《数据结构》
🎉道阻且长,行则将至
前言
嗨嗨,今天的博客是关于链表的题目,力扣题目之链表的中间节点和合并两个有序链表
一.链表的中间结点
题目为:
思路:
过程:
偶数个节点过程也类似。
代码如下;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
ListNode*slow,*fast;
slow=fast=head;
while(fast&&fast->next)//这个地方要注意
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
注意:循环限制条件是fast&&fast->next
1.两个条件之间必须是&&,因为有一个条件不满足,循环都无法进行。
2.不可以写成fast->next&&fast,因为当fast为假时,fast->next是无意义的。
二.合并两个有序链表
题目为:
思路:
将两个链表中的数据分别进行比较,然后将较小的数据尾插在新链表中
值得注意的是:这种题目涉及链表较多,需要多次判断链表是否为空,所以我们定义一个哨兵位(只存储地址,不存储有效数据)
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if(list1==NULL)//这里是讨论两种来链表为空的情况,为空直接返回另外一个链表
{
return list2;
}
if(list2==NULL)
{
return list1;
}
ListNode*l1,*l2;
l1=list1;
l2=list2;
ListNode*newHead,*newTail;
newHead=newTail=(ListNode*)malloc(sizeof(ListNode));//定义一个哨兵位
while(l1&&l2)
{
if(l1->val<l2->val)
{
newTail->next=l1;
newTail=newTail->next;
l1=l1->next;
}
else
{
newTail->next=l2;
newTail=newTail->next;
l2=l2->next;
}
}
if(l1)//跳出循环有两种情况,l1为空或l2为空
{
newTail->next=l1;//当l2为空时,跳出循环,这个时候l1还未走完,所以将l1后续的值加在新链表后面
}
if(l2)
{
newTail->next=l2;
}
ListNode*ret=newHead->next;
free(newHead);//malloc开辟空间记得释放
return ret;
}
嘿呀,如果对你有帮助的话,三连支持一下吧,感谢阅读