欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > Leetcode算法题(链表的中间节点+返回倒数第k个节点+合并两个有序链表)

Leetcode算法题(链表的中间节点+返回倒数第k个节点+合并两个有序链表)

2024/10/24 18:24:27 来源:https://blog.csdn.net/braveact/article/details/140468415  浏览:    关键词:Leetcode算法题(链表的中间节点+返回倒数第k个节点+合并两个有序链表)

题目1:

本题力扣链接:https://leetcode.cn/problems/middle-of-the-linked-list/solutions/164351/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/

思路1:单指针法

首先我们对链表进行遍历,记录链表的总长度N,再进行遍历原链表,返回刚跳出循环大于N/2时,对应的链表节点,即为中间节点。

typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* pcur=head;if(head==NULL){return head;}int count=0;while(pcur){count++;pcur=pcur->next;}pcur=head;int k=0;while(k<count/2){k++;pcur=pcur->next;}return pcur;
}

思路2:快慢指针法

typedef struct ListNode ListNode ;
struct ListNode* middleNode(struct ListNode* head) {ListNode* slow = head;ListNode* fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;}return slow;}

场景1:

场景二:

题目2:

OJ链接:

思路1:反转链表+遍历

先将原链表进行翻转,再将反转后的链表的头结点移动k-1位,最后直接返回此时节点的值。

typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k){//1. 先将原链表进行翻转//2. 再将反转后的链表的头结点移动k-1位ListNode* n1,*n2,*n3;n1=NULL,n2=head,n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}k=k-1;while(k--){n1=n1->next;}return n1->val;
}

复杂度分析:

时间复杂度:O(N),其中N为给定链表节点的数目。

空间复杂度:O(1)

思路2:遍历+挪动

先计算原链表的总长度s,再将原链表的头结点移动s-k位,返回此时节点对应的值。

typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k){ListNode* pcur=head;int s=0;while(pcur){s++;pcur=pcur->next;}int m=s-k;while(m--){head=head->next;}return head->val;}

复杂度分析:

时间复杂度:O(N),其中N为给定链表节点的数目。

空间复杂度:O(1)

题目3:

思路:遍历+尾插+比较

创建新的带头链表,依次遍历两个原链表,比较对应的值,尾插到新的链表尾部。

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if (list1 == NULL) {return list2;}if (list2 == NULL) {return list1;}ListNode* newlist,*newhead;newhead=newlist=(ListNode*)malloc(sizeof(ListNode));while (list1 && list2) {if (list1->val > list2->val) {newlist->next = list2;list2 = list2->next;} else {newlist->next = list1;list1 = list1->next;}newlist = newlist->next;}if (list1)newlist->next = list1;if (list2)newlist->next = list2;return newhead->next;
}

如果本文章对你有帮助,期待你的三连!!!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com