19、 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* p;
struct ListNode* q;
p = head;
q = head;
for(int i = 0; i < n; i++){
p = p->next;
}
if(p == NULL){
head = head->next;
return head;
}
for(;p->next != NULL ; p = p->next){
q = q->next; //找到要删除节点的前一个节点
}
p = q->next;
q->next = q->next->next;//删除倒数第n个节点
free(p);//释放空间
return head;
}
21、合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode newl;
struct ListNode* node;
node = &newl;
while(l1 != NULL&&l2 != NULL){
if(l1->val < l2->val){
node->next = l1;//将较小的l1接在node节点后
node = node->next;//同时node向后挪一位
l1 = l1->next;
}else{
node->next = l2;
node = node->next;
l2 = l2->next;
}
}
if(l1 != NULL){//将较长的一段所剩余的接在node节点后
node->next = l1;
}else{
node->next = l2;
}
return newl.next;
}