代码随想录算法训练营第五天| 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题还挺有意思的,要画图理解快慢指针追逐的过程,再用表达式算出之间的联系。
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 };
自在飞花轻似梦

浙公网安备 33010602011771号