给你两个链表 list1
和 list2
,它们包含的元素分别为 n
个和 m
个。
请你将 list1
中下标从 a
到 b
的全部节点都删除,并将list2
接在被删除节点的位置。
第一遍
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2){ struct ListNode* beginning2=list2; struct ListNode* end2=list2; while(end2->next) end2=end2->next; struct ListNode* p=list1; struct ListNode* linka=list1; struct ListNode* linkb=list1; p=list1; while(p->next) {if(p->next->val==a) {linka=p; p=p->next;} else if(p->next->val==b) {linkb=p->next; p=p->next;} else {p=p->next;} } linka->next=beginning2; end2->next=linkb->next; return list1; }
第二遍 参考题解
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2){ struct ListNode* end2=list2; while(end2->next) end2=end2->next; struct ListNode* preA = list1; for (int i = 0; i < a - 1; i++) { preA = preA->next; } struct ListNode* preB = preA; for (int i = 0; i < b - a + 2; i++) { preB = preB->next; } preA->next=list2; end2->next=preB; return list1; }
和题解的思路是一样的 把要改的结点先找到
但是如何找
自己做的时候忽略了第一个链表的特点 即从0开始依次递增
没有利用这个特点 要把整个链表遍历完才能找到要的结点(找到第二个之后break也试过了还是不行)
标签:end2,ListNode,struct,int,list1,next,1669 From: https://www.cnblogs.com/LYoungH/p/17080376.html