代码随想录算法训练营第五天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交(同160题)、142.环形链表Ⅱ

24题多个指针遍历即可,需要注意其中的衔接。
复制代码
 1 class Solution {
 2 public:
 3     ListNode* swapPairs(ListNode* head) {
 4         if (head == NULL || head->next == NULL) {
 5             return head;
 6         }
 7         ListNode* h1 = head;
 8         ListNode* h2 = head->next;
 9         ListNode* temp = (ListNode*)malloc(sizeof(struct ListNode));
10         ListNode* ans = temp;
11         temp->next =h1;
12         while (h1 && h2) {
13             h1->next = h2->next;
14             h2->next = h1;
15             temp->next = h2;
16             temp = h1;
17             if (h1->next && h1->next->next) {
18                 h1 = h1->next;
19                 h2 = h1->next;
20             }
21             else {
22                 ans = ans->next;
23                 return ans;
24             }
25         }
26         ans = ans->next;;
27         return ans;        
28     }
29 };
复制代码

19题就是一个快慢指针解决

复制代码
 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) 
 4     {
 5         //快慢指针处理 让快指针先走 再让慢指针同步进行
 6         //主要问题是可能会涉及删除第一个节点 手动添加一个头节点就很好处理了
 7         ListNode* tmp = new ListNode(0);
 8         tmp->next = head;
 9         ListNode* h1 = head;
10         ListNode* h2 = tmp;
11         while(n--){
12             h1 = h1->next;
13         }
14         while(h1){
15             h1 = h1->next;
16             h2 = h2->next;
17         }
18         h2->next = h2->next->next;   
19         return tmp->next;
20     }
21 };
复制代码

面试题 02.07. 链表相交(同160题)主要是理清思路,如何用遍历获取二者之间的长度关系,详情见代码注释。

复制代码
 1 class Solution {
 2 /*
 3 假设相交
 4 两个链表 相交后长度为len3 
 5 短的链表相交前长度为len2 长的链表相交前比短的长len1
 6 即 短链表长度为len2+len3 长链表长度为len1+len2+len3
 7 长f1 短s1 结点指针同时出发 等短链表走完 长链表f1还剩len1到null
 8 长链表起点新起一个指针f2出发  等f1走完 f2刚好走了s1的距离 
 9 此时短新起s2指针出发
10 如果二者有交点 在到达null前 一定有f2==s2 没有就是不相交
11 */
12 public:
13     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
14         ListNode *a = headA;
15         ListNode *b = headB;
16         ListNode* l1;
17         ListNode* l2;
18         ListNode* s2;
19         while(a && b) {
20             a=a->next;
21             b=b->next;
22         }
23         if(a == NULL){
24             l1 = b;
25             l2 = headB;
26             s2 = headA;
27         }
28         else{
29             l1 = a;
30             l2 = headA;
31             s2 = headB;
32         }
33         while(l1 && l2){
34             l1=l1->next;
35             l2=l2->next;
36         }
37         while(l2 && s2){
38             if(l2==s2){
39                 return l2;
40             }
41             l2=l2->next;
42             s2=s2->next;
43         }
44         return NULL;
45     }
46 };
复制代码

142题还挺有意思的,要画图理解快慢指针追逐的过程,再用表达式算出之间的联系。

还是直接看lc的官方题解方法二吧,讲得很明白。

复制代码
 1 class Solution {
 2 public:
 3     ListNode* detectCycle(ListNode* head)
 4 {
 5     ListNode* fast = head;
 6     ListNode* slow = head;
 7     ListNode* ans = head;
 8     if(head == NULL)
 9     {
10         return NULL;
11     }
12     while (1)
13     {
14         fast = fast->next;
15         if (fast==NULL) {
16             return NULL;
17         }
18         fast = fast->next;
19         if (fast==NULL) {
20             return NULL;
21         }
22         slow = slow->next;
23         if (fast == slow) {
24             while (1) {
25                 if (ans == slow) {
26                     return ans;
27                 }
28                 else {
29                     ans = ans->next;
30                     if(ans == slow)
31                     {
32                         return ans;
33                     }
34                     slow = slow->next;
35                 }
36             }
37         }
38     }
39 }
40 };
复制代码
posted @   清源风起时  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示