1.合并有序链表
例题21
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路:
递归的解决问题递归比较头节点并使头节点指向较小值
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{
if(list1 == NULL)
{
return list2;
}
else if(list2 == NULL)
{
return list1;
}
else if(list1->val <= list2->val)
{
list1->next = mergeTwoLists(list1->next,list2);
return list1;
}
else
{
list2->next = mergeTwoLists(list1,list2->next);
return list2;
}
}
};
2.链表中的中间节点
例题876.
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
思路:
双指针法,定义个快慢指针,快指针一次两步,慢指针一次一步当快指针为NULL
则慢指针为中间节点
class Solution {
public:
ListNode* middleNode(ListNode* head)
{
int count = 0;
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL)
{
count++;
fast = fast->next;
if(fast == NULL)
{
break;
}
fast = fast->next;
slow = slow -> next;
}
return slow;
}
};
3.删除倒数元素
例题19
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
思路:
双指针法,第一个指针先走n步之后两个指针一起走知道到第一个指针为NULL,第二个指针n位置
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode* pointer1 = (ListNode*)malloc(sizeof(ListNode));
pointer1->next = head;
ListNode* pointer2 = pointer1;
ListNode* temp = pointer2;
if(head->next == NULL)
{
if(n == 1)
{
return NULL;
}
else
{
return head;
}
}
while(n != 0)
{
pointer1 = pointer1->next;
n--;
}
while(pointer1->next != NULL)
{
pointer1 = pointer1->next;
pointer2 = pointer2->next;
}
pointer2->next = pointer2->next->next;
return temp->next;
}
};